簡體   English   中英

在python腳本中通過子進程將參數傳遞給mpg123

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM