从Python程序向FIFO写入数据

3 投票
1 回答
5713 浏览
提问于 2025-04-16 10:14

我正在尝试通过一个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 是可执行的并且有一个 #! 行,你就不需要 executableshell 这些关键字参数,你可以直接这样做:

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

不过,我觉得最好还是像上面那样直接用 openwrite 在Python里处理。

撰写回答