使用python脚本中的子进程将参数传递给mpg123

时间:2017-03-06 00:32:19

标签: python subprocess glob

我有一个Python3脚本响应来自旋转拨号电话的输入(通过覆盆子pi上的GPIO引脚。)如果我拨打1,我的脚本使用subprocess告诉{{1播放名为mpg123的文件。 1.mp3播放2,依此类推7,播放效果如下:

2.mp3

如果我拨打filename = "/media/"+str(number)+".mp3" player = subprocess.Popen(["mpg123", filename, "-q"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) ,神奇的8球,脚本的行为应该不同。我希望它用“小shuffle”标志8来调用mpg123。从命令行,我知道如何拨打电话:

-z

我想在我的python3脚本中使用这个确切的语法,但它无法正常工作。

 mpg123 -z /media/mp3s/*

什么都没发生。脚本只是耐心地等待下一个非8输入。

作为B计划,我想也许我可以通过 if number ===8: player = subprocess.Popen(["mpg123", "-z", "/media/mp3s/*"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 将文件列表传递给mpg123:

glob.glob

这会导致脚本崩溃,因为filelist = glob.glob('/media/mp3s/*.mp3') print(filelist) player = subprocess.Popen(["mpg123", "-z", "--list", filelist], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (尽管它在文件死亡之前就已成功打印出来。)我认为我必须非常接近至少一种方法,但我无法弄清楚最后一点语法。任何想法都赞赏。**

好吧 - 我找到了一种让它工作的方法,使用mpg123的内置目录指定标志TypeError: Can't convert 'list' object to str implicitly。我仍然很好奇如何让我的其他一种或两种方法起作用。为了记录,这有效:

-B

2 个答案:

答案 0 :(得分:1)

要修复方法A,您需要设置shell=True以获得通配符支持。然后命令本身应该是一个字符串而不是列表:

if number ===8:
     player = subprocess.Popen("mpg123 -z /media/mp3s/*", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

文档在本节底部附近提到了这种行为:

https://docs.python.org/3.6/library/subprocess.html#frequently-used-arguments

不同之处在于没有shell标志,python正在运行列表中的第一个条目作为命令,并使用其余作为参数(*按字面意思)。使用shell标志,整个字符串都被填入,并允许shell执行它的操作。我无法重现这个确切的情况但我想这个命令会尝试运行并且无法找到名为/media/mp3s/*的文件。

然而,我认为你的最终解决方案更加炽热,你应该坚持下去。指定shell=True通常只意味着没有使用完成文件名扩展等的python内置函数(上面列出的相同文档中列出的这些示例)。

答案 1 :(得分:1)

你的解决方案可能更好,但我想我会指出你的计划B的问题:

filelist = glob.glob('/media/mp3s/*.mp3')
print(filelist)
player = subprocess.Popen(["mpg123", "-z", "--list", filelist], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

这里的问题是您将filelist作为项目传递给列表。所以你会得到一个包含列表的列表:

["mpg123", "-z", "--list", [ '/media/mp3s/1.mp3', '/media/mp3s/2.mp3' ]]

然而你想要的是:

["mpg123", "-z", "--list", '/media/mp3s/1.mp3', '/media/mp3s/2.mp3']

要获得这些,您需要一起加入列表:

player = subprocess.Popen(["mpg123", "-z", "--list"] + filelist, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

未经测试,但我相信这应该可行。

相关问题