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 № 1Nie 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ę.