Написать в FIFO из программы Python - PullRequest
3 голосов
/ 19 января 2011

Я пытаюсь контролировать громкость mplayer из программы на python.Программа mplayer запускается из сценария 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

Затем у меня есть графический интерфейс, написанный на Python, который должен контролировать громкость экземпляра mplayer, который воспроизводится.Я пробовал следующее:

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

Это работает, если я заменяю $ musicvol вместо числового значения, но это, к сожалению, бесполезно.Мне нужно иметь возможность передать переменную.

Я бы также смог решить ее, вызвав скрипт bash из приложения Python, но я также не могу заставить это работать:

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

1 Ответ

7 голосов
/ 19 января 2011

Вам не нужно вызывать os.system и вызывать оболочку для записи этой строки в FIFO из вашего скрипта Python - вы можете просто сделать:

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

Мне не понятно, что выожидайте, что произойдет в вашем первоначальном питоне - установлен ли musicvol в среде?Если вместо этого это переменная Python, которую вы хотите вставить в передаваемую строку, самый простой способ - использовать оператор интерполяции строк (%), как я делал в примере выше.

В вашем примере использования subprocess.call вам не нужны аргументы ключевого слова executable или shell, если setvolume.sh является исполняемым и имеет строку #! - вы можете просто сделать:

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

Однако в Python лучше просто использовать open и write, как я думаю выше.

...