我有一个名为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”重写它。在
您使用的是Python2.5还是2.6的早期版本? 你能试试这个吗subprocess.check_输出当stderr重定向到stdout时:
如果out\u err同时获得输出和错误,则可能需要将stdout和stderr重定向到文件对象,然后再从这些文件对象中读取(因为windows没有类似unix的管道):
^{pr2}$由于错误消息实际上不会出现在
stdout
和stderr
上,所以我最好的猜测是,该程序使用的是Windows的等效打开/dev/tty
,不管是什么。{cd4>我知道在Windows中没有类似的技巧。你可以试试Expect for Windows。在相关问题 更多 >
编程相关推荐