我有一個名爲pregeocode的窗口應用程序(我們缺乏源代碼),這個程序基本上將地理編碼寫入輸入文件。除非出現錯誤,否則該程序實際上不會寫入任何內容。這個程序通常是從一個小的Python程序中調用的(它處理參數等,並進行所有有趣的預處理)。捕獲未寫入標準輸出stderr的控制檯輸出?
我們通過查看輸出文件是否實際創建(無論如何總是返回0)來檢查它是否失敗。但是,如果子進程失敗,則表明沒有任何內容打印到stderr或stdout。 (它成功地處理了大約100個左右,但只有一個單獨的一個很糟糕,但我希望能夠看到是什麼原因導致錯誤)
小python腳本通過subprocess.Popen調用應用程序:
argslist = [r'C:\workspace\apps\pregeocode.exe', '-in', inputfilename, '-out', outputfilename, '-gcp', gcp_file]
p = subprocess.Popen(argslist, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
print str(p.communicate())
給出的輸出:
('', '')
但是如果我使用通過CMD相同的參數手動運行該程序,我得到的輸出:
45 IMAGE_EXTENT_TOO_SMALL
(周圍有60多不同的錯誤信息,45是錯誤編號)
使用shell = True參數不會改變任何東西,我也可以在網上找到任何有關這個問題。實際的exe是很久以前在內部製作的東西,我們缺乏它的源代碼,所以我看不出它是如何打印出來的。
那麼,爲什麼不能subprocess實際捕獲這個stdout或stderr?
編輯
os.system(" ".join(argslist))
正確打印錯誤消息:
45 IMAGE_EXTENT_TOO_SMALL
EDIT 2
原來的應用程序使用ERDAS的工具包。他們的工具包將所有stdout/stderr重定向到它們的日誌子系統。日誌子系統然後通過「CON」重寫它。
當你用'2> out.err'從cmd運行它時會發生什麼? out.err是否以文本結束? – 2010-10-13 18:51:57
是的,它正確打印出消息。 – UberJumper 2010-10-13 18:52:46
可以肯定的是,「打印出來」的意思是「把它放在文件中」,對吧?它不顯示在屏幕上。 – 2010-10-13 18:57:52