/ / Napisz do FIFO z programu Python - python, bash, pipe, fifo

Napisz do FIFO z programu Python - python, bash, pipe, fifo

Próbuję kontrolować głośność mplayera z programu Pythona. Program mplayer jest uruchamiany ze skryptu bash:

#!/bin/bash
mkfifo /home/administrator/files/mplayer-control.pipe
/usr/bin/mplayer -slave -input file=/home/administrator/files/mplayer-control.pipe /home/administrator/music/file.mp3

Następnie mam napisane w Pythonie GUI, które powinno kontrolować głośność odtwarzanego mplayera. Próbowałem:

os.system("echo "set_property volume $musicvol" > /home/administrator/files/mplayer-control.pipe")

To działa, jeśli zamiast niego zastąpię $ musicvol wartością numeryczną, ale niestety nie ma to sensu. Muszę być w stanie przekazać zmienną.

Byłbym również w stanie rozwiązać ten problem, wywołując skrypt bash z aplikacji Pythona, ale nie mogę go uruchomić:

subprocess.call("/home/administrator/files/setvolume.sh", executable="bash", shell=True)

Odpowiedzi:

7 dla odpowiedzi № 1

Nie musisz dzwonić os.system i wywołaj powłokę, aby napisać tę linię do FIFO ze skryptu Pythona - możesz po prostu:

new_volume = 50
with open("/home/administrator/files/mplayer-control.pipe","w") as fp:
fp.write("set_property volume %dn" % (new_volume,))

Jednak nie jest dla mnie jasne, czego się spodziewasz w swoim oryginalnym pytonie - jest musicvol osadzony w środowisku? Jeśli zamiast tego jest to zmienna Pythona, którą chcesz wstawić do łańcucha, który przekazujesz, najłatwiejszym sposobem jest użycie operatora interpolacji ciągu (%) jak zrobiłem w powyższym przykładzie.

W twoim przykładzie użycia subprocess.call nie potrzebujesz executable lub shell argumenty słowa kluczowego, jeśli setvolume.sh jest wykonywalny i ma #! line - możesz po prostu:

subprocess.call("/home/administrator/files/setvolume.sh")

Jednak lepiej jest po prostu użyć open i write w Pythonie jak powyżej myślę.