[英]Passing argument to mpg123 with subprocess in a python script
我有一個Python3腳本,該腳本可響應來自旋轉撥號電話的輸入(通過樹莓派上的GPIO引腳)。如果我撥打1
,則腳本使用subprocess
告訴mpg123
播放名為1.mp3
的文件。 2
播放2.mp3
,依此類推,直到7。
filename = "/media/"+str(number)+".mp3"
player = subprocess.Popen(["mpg123", filename, "-q"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
如果我撥8
魔術球,則腳本的行為應有所不同。 我希望它使用“ little shuffle”標志-z
來調用mpg123。 從命令行,我知道如何進行該調用:
mpg123 -z /media/mp3s/*
我想在我的python3腳本中使用這個確切的語法,但是它不起作用。
if number ===8:
player = subprocess.Popen(["mpg123", "-z", "/media/mp3s/*"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
什么都沒發生。 腳本只是耐心地等待下一個非8輸入。
作為計划B,我想也許可以通過glob.glob
將文件列表傳遞給mpg123:
filelist = glob.glob('/media/mp3s/*.mp3')
print(filelist)
player = subprocess.Popen(["mpg123", "-z", "--list", filelist], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
這會導致腳本崩潰,因為TypeError: Can't convert 'list' object to str implicitly
(盡管它確實在死之前成功打印出了文件列表。)我想我至少必須非常接近一種方法,但是我可以沒有弄清楚語法的最后一點。 任何想法表示贊賞。**
好的-我想出了一種方法,可以使用mpg123的內置目錄指定標志-B
。 我仍然對如何使一種或兩種其他方法起作用感到好奇。 作為記錄,這有效:
player = subprocess.Popen(["mpg123", "-Bz", "/media/mp3s/"],.......
要解決方法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/*
。
但是,我認為您的最終解決方案更適合pythonic,因此您應該堅持這一點。 指定shell=True
通常僅表示未使用完成文件名擴展等功能的python內置程序(這些示例在上面列出的同一文檔中列出)。
您的解決方案可能更好,但是我想指出您的計划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)
未經測試,但我相信這應該可行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.