我有一个名为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