2014-09-28 106 views
0

我使用Python 2.7.6和IDLE在Windows 7的Python腳本IDLE不顯示子進程的輸出,但CMD.EXE確實

我有兩個Python腳本:

script.py:

import subprocess, os, sys 

print("hello 1") 

mypath = os.path.abspath(__file__) 
mydir = os.path.dirname(mypath) 
start = os.path.join(mydir, "script2.py") 

subprocess.call([sys.executable, start, "param"]) 

print("bye 1") 

和script2.py正在由以前的腳本調用:

import sys 

print "hello 2" 

print (sys.argv[1]) 

print "bye 2" 

如果我跑script.py w ^第i個cmd.exe shell中我得到預期的結果:

C:\tests>python ./script.py 
hello 1 
hello 2 
param 
bye 2 
bye 1 

但是,如果我打開script.py與IDLE編輯器,並與F5運行它,我得到這樣的結果:

>>> ================================ RESTART ================================ 
>>> 
hello 1 
bye 1 
>>> 

爲什麼子不寫入IDLE Python shell的腳本?

回答

1

您正在運行子進程而不提供任何標準輸出或標準錯誤。

在終端中運行時,子進程將繼承stdout和stderr,所以它打印的任何內容都會顯示與輸出混合在一起。

當在IDLE中運行時,子進程將繼承您的標準輸出和標準錯誤,但那些不會去任何地方。 IDLE攔截Python級別的包裝sys.stdoutsys.stderr *,因此從Python內部打印到它們的所有內容都將在GUI窗口中結束,但任何變爲的實際 stdout或stderr就像您運行的任何子流程的輸出繼承你的流 - 只是無處可去**

最簡單的解決方法是從子進程捕獲stdout和stderr並自己打印它們。例如:

out = subprocess.check_output([sys.executable, start, "param"], 
           stderr=subprocess.STDOUT) 
print out 

* IDLE是比它更復雜的外觀。它實際上爲GUI窗口運行單獨的進程,並運行代碼,通過套接字進行通信。 IDLE爲您的腳本提供的sys.stdout(並且同樣適用於其他人)不是file對象,它是一個自定義文件類對象,它通過套接字上的遠程過程調用將每個write重定向到GUI進程。

**其實,如果你從一個終端,而不是通過雙擊它的圖標啓動IDLE,子進程的輸出,最終可能。我不確定它是如何在Windows上工作的。但無論如何,這對你沒有幫助。

0

我證實了,abamert的變化在2.7版本的Win7上起作用,而Idle通常從圖標開始。輕微的故障是'打印出來'插入一個額外的空白行。通過將未來導入和使用結束參數的功能打印出來,這很容易被改變。

from __future__ import print_function 
... 
print(out, end='') 

使用Python 3,有一個額外的問題,即「出」是字節而不是STR,所以它打印爲

b'hello 2\r\nparam\r\nbye 2\r\n' 

因爲你的輸出是所有ASCII,這可以通過固定將打印呼叫更改爲

print(out.decode(), end='') 

生成的程序在2.7和3.x中的功能完全相同。

相關問題