从Python程序向FIFO写入数据。

3

我正在尝试从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

您不需要调用os.system并调用shell来从Python脚本向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")

然而,我认为在Python中最好只使用上述的openwrite


非常感谢你,马克!这解决了问题(使用了你推荐的替代方案)。 - Julio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接