[英]Python Subprocess how to pass subshell argument
我正在做一個使用SoX將多個音頻文件合並在一起的腳本。
此命令在終端中工作
sox &(ls *.mp3) out.mp3
但是如果我嘗試通過調用 subprocess.run() 在 python 腳本中使用它,它不會
subprocess.run(['sox', '$(ls *.mp3)', 'out.mp3'])
> sox FAIL formats: can't open input file `$(ls *.mp3)': No such file or
> directory
我的圖像是因為子shell操作,但我不知道如何正確傳遞它。 我也嘗試過,正如其他一些帖子所建議的那樣,傳遞參數shell=True
但它說
> sox FAIL sox: Not enough input filenames specified
我在同一個工作目錄中,我也嘗試提供完整路徑,但也不起作用。
我可以編寫一個 bash 腳本並調用它,但我想知道如何使用 Python 處理這種情況。
您想使用shell=True
強制subprocess
通過 shell 解釋器運行您的命令並解析通配符/子命令。 然而,這(取決於平台)強制參數作為 string傳遞,而不是作為參數列表傳遞。 懶惰和不安全的方式有很多限制。
等待。 你可以不用shell=True
使用glob.glob
:
subprocess.run(['sox'] + glob.glob('*.mp3') + ['out.mp3'])
最好檢查當前文件夾中是否確實有mp3
文件,因此:
input_files = glob.glob('*.mp3')
if input_files:
subprocess.run(['sox'] + input_files + ['out.mp3'])
else:
raise Exception("No mp3 files")
如果您收到"No mp3 files"
消息,請檢查當前目錄。 對輸入目錄使用參數總是好的,避免依賴當前目錄( glob.glob(os.path.join(input_directory,'*.mp3'))
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.