3 回答

TA貢獻1773條經驗 獲得超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的第一個參數Popen是單個字符串(反之亦然;如果沒有,則shell=True必須自己將命令行解析為標記)。
當然,cats 是無用的,但是如果您將它們替換為 shell 可以輕松優雅地執行并且無法輕松地用本機 Python 代碼替換的內容,那么這可能是正確的選擇。
簡而言之,<(command)就是Bash進程的替代;shell 將command在子進程中運行,并將參數替換為進程生成輸出的打開文件句柄的設備名稱。所以sort會看到類似的東西
sort -mk /dev/fd/63 /dev/fd/64
其中/dev/fd/63是第一個命令的輸出可用的管道,并且/dev/fd/64是另一個命令的標準輸出的讀取端。

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

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