2010-08-27 39 views
1

我正在使用subprocess.*從python3程序運行一個命令管道;我不希望 通過一個shell,因爲我將參數傳遞給我的子命令,並確保這些不會被shell誤解會是噩夢。當啓動順序改變時,正在運行管道子進程會產生不同的結果?

subprocess文檔給出瞭如何做到這一點的例子:

p1 = Popen(command1, stdout=PIPE) 
p2 = Popen(command2, stdin=p1.stdout) 
p2.wait() 
p1.wait() 

這種運作良好。不過,我想知道,如果這將是更安全的生產商之前開始消費,所以

p2 = Popen(command2, stdin=PIPE) 
p1 = Popen(command1, stdout=p2.stdin) 
p2.wait() 
p1.wait() 

我預計在完全相同的方式表現,但顯然他們沒有。第一個代碼完美無缺地工作;第二,我的程序掛起;如果我看看系統,我可以看到p1已經死了,等待被收割,並且p2永遠掛起。對此有沒有合理的解釋?

回答

1

看起來像p2(消費者)掛起,因爲它的stdin保持打開狀態。如果代碼如此修改,則兩個進程都能夠成功完成:

p2 = Popen(command2, stdin=PIPE) 
p1 = Popen(command1, stdout=p2.stdin) 
p1.wait() 
p2.stdin.close() 
p2.wait() 

我敢打賭,這是泄漏法的行動法。

+0

哇,看起來你是對的。但我仍不明白爲什麼這是必需的。行爲差異在哪裏出現?在子進程調用exec()之後,他們所做的是在父控制之外,對吧?父母的GC可以參與嗎? – b0fh 2010-08-27 20:47:43

+0

@ b0fh,這對我來說也不清楚。 – Constantin 2010-08-28 19:29:40

相關問題