从Python程序向FIFO写入数据
我正在尝试通过一个Python程序来控制mplayer的音量。这个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写的图形界面(GUI),它应该能够控制正在播放的mplayer实例的音量。我尝试了以下方法:
os.system('echo "set_property volume $musicvol" > /home/administrator/files/mplayer-control.pipe')
如果我把$musicvol替换成具体的数字值,这样是可以工作的,但这对我来说没有用。我需要能够传递这个变量。
我也可以通过从Python应用程序调用一个bash脚本来解决这个问题,但我也无法让它正常工作:
subprocess.call("/home/administrator/files/setvolume.sh", executable="bash", shell=True)
1 个回答
7
你不需要在你的Python脚本里调用 os.system
来执行一个命令行去写那一行到FIFO,你可以直接这样做:
new_volume = 50
with open("/home/administrator/files/mplayer-control.pipe","w") as fp:
fp.write("set_property volume %d\n" % (new_volume,))
不过,我不太明白你在原来的Python代码里期待发生什么——musicvol
是在环境变量里设置的吗?如果它是你想放进字符串里的一个Python变量,最简单的方法就是用字符串插值操作符(%
),就像我在上面的例子里做的那样。
在你使用 subprocess.call
的例子里,如果 setvolume.sh
是可执行的并且有一个 #!
行,你就不需要 executable
或 shell
这些关键字参数,你可以直接这样做:
subprocess.call("/home/administrator/files/setvolume.sh")
不过,我觉得最好还是像上面那样直接用 open
和 write
在Python里处理。