2009-11-30 192 views
6

我正在使用subprocess.popen運行子程序。當我從命令窗口(cmd.exe)啓動我的Python程序時,隨着程序的發展,程序會在窗口中寫入一些信息和日期。從子進程異步讀取標準輸出.Popen

當我在命令窗口中運行我的Python代碼而不是時,它會爲此子程序的輸出打開一個新的命令窗口,我想避免這種情況。當我用下面的代碼,它不顯示cmd窗口,但它也沒有打印狀態:

p = subprocess.Popen("c:/flow/flow.exe", shell=True, stdout=subprocess.PIPE) 
print p.stdout.read() 

我怎樣才能顯示子程序在我的程序的輸出輸出,因爲它發生?

+2

爲什麼這個社區wiki? – 2009-11-30 20:36:29

+2

「窗口窗口」什麼是Windows窗口?你在使用GUI框架嗎?哪一個? – 2009-11-30 20:38:40

+0

好吧,我通過arcgis運行模型。當我點擊我在那裏創建的工具時,會出現一個窗口並顯示進度。我想看到在我的命令窗口中出現的行。 – Mesut 2009-11-30 21:43:53

回答

7

使用此:

cmd = subprocess.Popen(["c:/flow/flow.exe"], stdout=subprocess.PIPE) 
for line in cmd.stdout: 
    print line.rstrip("\n") 
cmd.wait() # you may already be handling this in your current code 

注意,你仍然要等待子程序刷新其標準輸出緩衝區(也就是通常緩衝的不同但不包括寫入到終端窗口),所以你可能在子程序打印時不會立即看到每一行(這取決於各種操作系統細節和子程序的細節)。

另請注意我是如何刪除shell = True的,並將字符串參數替換爲一個通常推薦的列表。

+0

或者'line.rstrip ..',您可以使用'line'(注意尾部逗號) – 2012-08-15 20:36:01

+2

['用於iter中的行(cmd.stdout.readline,「 「):print line,'](http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line)可能會提供更直接的輸出,可能會避免文件迭代器中的預讀緩衝區(注意:子程序仍然需要刷新它的stdout) – jfs 2013-01-06 17:16:49

+1

看不出爲什麼這是異步。 – ManuelSchneid3r 2017-03-31 10:26:39

相關問題