3 回答

TA貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊
如果你想使用 shell 功能,你必須使用shell=True. 如果你想使用 Bash 功能,你必須確保你運行的 shell 是 Bash。
self.proc = subprocess.Popen(
'sort -mk1 <(cat file1.txt) <(cat file2.txt)',
stdout=subprocess.PIPE,
shell=True,
executable='/bin/bash')
請注意and Friendsshell=True的第一個參數(shù)Popen是單個字符串(反之亦然;如果沒有,則shell=True必須自己將命令行解析為標(biāo)記)。
當(dāng)然,cats 是無用的,但是如果您將它們替換為 shell 可以輕松優(yōu)雅地執(zhí)行并且無法輕松地用本機 Python 代碼替換的內(nèi)容,那么這可能是正確的選擇。
簡而言之,<(command)就是Bash進(jìn)程的替代;shell 將command在子進(jìn)程中運行,并將參數(shù)替換為進(jìn)程生成輸出的打開文件句柄的設(shè)備名稱。所以sort會看到類似的東西
sort -mk /dev/fd/63 /dev/fd/64
其中/dev/fd/63是第一個命令的輸出可用的管道,并且/dev/fd/64是另一個命令的標(biāo)準(zhǔn)輸出的讀取端。

TA貢獻(xiàn)1796條經(jīng)驗 獲得超7個贊
你的腳本中有很多問題。
首先,Popen
由于以下幾個原因,您將無法工作:
第一個參數(shù)應(yīng)該是要運行的命令,而您傳遞了
sort -mk
并且沒有這樣的文件。您應(yīng)該簡單地傳遞sort
, 并-mk
作為參數(shù)傳遞。進(jìn)程替換
<( command )
是由 shell 處理的事情,它正在執(zhí)行一些操作,例如運行命令、創(chuàng)建 FIFO 并將其替換為 FIFO 的名稱。直接將這些傳遞給sort
是行不通的。sort
可能只會將其視為<(
文件名。
您的第二種使用方式os.exec*
也不起作用,因為os.exec*
它將取代您當(dāng)前的流程。因此,它永遠(yuǎn)不會繼續(xù)執(zhí)行 Python 腳本中的下一條語句。
就您而言,似乎沒有理由使用流程替換。為什么你不能簡單地做一些類似的事情subprocess.Popen(['sort', '-mk', 'filename1', 'filename2'])
?

TA貢獻(xiàn)1789條經(jīng)驗 獲得超8個贊
我不明白你為什么要這樣做 sort -mk1 $(cat file),sort 可以對文件進(jìn)行操作。查看check_output。這會讓你的生活變得簡單
output=subprocess.check_output('ls')
for line in output:
print(line)
當(dāng)然,您必須處理異常,手冊頁有詳細(xì)信息
添加回答
舉報