【发布时间】:2011-04-25 00:37:43
【问题描述】:
我有一个名为 pregeocode 的 Windows 应用程序(我们缺少源代码),该程序基本上将地理编码写入输入文件。除非出现错误,否则该程序实际上不会向控制台写入任何内容。该程序通常从一个小型 Python 程序中调用(它处理参数等,并进行所有有趣的预处理)。
我们通过查看输出文件是否实际创建来检查它是否失败(无论如何它总是返回 0)。但是,当它失败时,子进程显示没有任何内容打印到 stderr 或 stdout。 (它成功处理了大约一百个左右,通常只有一个是坏的,但我希望能够看到导致错误的原因)
小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
编辑 2
原来应用程序使用 ERDAS 的工具包。他们的工具包将所有标准输出/标准错误重定向到他们的日志子系统。日志子系统然后通过“CON”重写它。
【问题讨论】:
-
当您使用
2> out.err从cmd 运行它时会发生什么? out.err 是否以文本结尾? -
是的,它正确地打印出消息。
-
可以肯定的是,“打印输出”的意思是“放入文件中”,对吧?它不会显示在屏幕上。
-
它将它打印到控制台但不将输出重定向到文件。抱歉,请快速添加评论。所以 out.err 文件完全是空的。
-
那时可能没有使用stderr。我认为@zack 正在做某事。
标签: python subprocess