簡體   English   中英

Python子進程如何傳遞子shell參數

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

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