捕获未写入stdout、stderr的控制台输出?

2024-09-27 09:22:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为pregeocode的windows应用程序(我们缺少源代码),这个程序基本上是将地理编码写入一个输入文件。除非出现错误,否则这个程序实际上不会向控制台写入任何内容。这个程序通常从一个小Python程序调用(它处理参数等,并进行所有有趣的预处理)。在

我们通过查看是否实际创建了输出文件来检查它是否失败(不管发生什么,它总是返回0)。然而,当它失败时,子进程显示没有输出到stderr或stdout。(它成功地处理了大约一百个,在美国只有一个是坏的,但是我很想知道是什么导致了错误)

小python脚本通过子流程.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())

给出以下输出:

^{pr2}$

但是,如果我通过cmd使用相同的参数手动运行程序,则会得到以下输出:

45 IMAGE_EXTENT_TOO_SMALL

(大约有60条不同的错误消息,45条表示错误号)

使用shell=True参数不会更改任何内容,我也无法在网上找到有关此问题的任何内容。实际的exe是很久以前在内部制作的,我们缺少它的源代码,所以我看不出它是如何打印出消息的。在

那么为什么子进程不能真正捕获这个的stdout或stderr呢?在

编辑

os.system(" ".join(argslist))

正确打印错误消息:

45 IMAGE_EXTENT_TOO_SMALL

编辑2

结果应用程序使用了ERDAS的工具箱。他们的工具箱将所有stdout/stderr重定向到日志子系统中。然后日志子系统通过“CON”重写它。在


Tags: 文件程序应用程序消息内容参数源代码进程
2条回答

您使用的是Python2.5还是2.6的早期版本? 你能试试这个吗subprocess.check_输出当stderr重定向到stdout时:

out_err = subprocess.check_output(argslist, stderr=subprocess.STDOUT)

如果out\u err同时获得输出和错误,则可能需要将stdout和stderr重定向到文件对象,然后再从这些文件对象中读取(因为windows没有类似unix的管道):

^{pr2}$

由于错误消息实际上不会出现在stdoutstderr上,所以我最好的猜测是,该程序使用的是Windows的等效打开/dev/tty,不管是什么。{cd4>我知道在Windows中没有类似的技巧。你可以试试Expect for Windows。在

相关问题 更多 >

    热门问题