2014-11-13 61 views
0

我有一个用C++编写的程序,它所做的就是将1/0划分为一个异常。Python子程序异常处理

我通过Python的子进程库运行该程序的.exe。我的目标是捕获并记录C++程序在Python中产生的异常。

p = subprocess.Popen(['C:\\Users\\name\\Desktop\\Win32Project1.exe']) 

当这行代码执行时,p是一个非零值,意味着发生了错误。 我正在运行Windows 7和使用Python 3.4.1

+0

取决于你多大的控制权需要你将需要处理输出和错误管道+等待()的返回值。也许[check_output](https://docs.python.org/3.3/library/subprocess.html#subprocess.check_output)为你完成这项工作? – FlorianLudwig

+1

_当这行代码执行时,p是一个非零值,表示发生了错误 - - 不,这不会发生。 'subprocess.Popen'返回一个永远不为零的Popen对象。如果你愿意,你可以调用'p.wait()'并获得返回码。 – tdelaney

回答

0

我很确定你不能跟踪来自不同进程的异常。 您应该尝试在C++程序中捕捉异常,并通过多种进程间通信手段之一传递它。

HTH, Cabbi

+0

当我用windbg运行该进程时,它会跟踪异常并记录错误,所以它一定是可能的,是吗?通过C++代码并修改它不会是我的选择。 – KKK

+0

您可以使用python与平台的调试工具进行交互。我搜索[调用窗口调试钩子从python](https://www.google.com/search?client=ubuntu&channel=fs&q=call+windows+debug+hooks+from+python&ie=utf-8&oe=utf-8)和得到了一些有趣的答案,如[winappdbg](http://winappdbg.sourceforge.net/)。但是为了公平对待@cabbi,你不应该提到你正在编写调试器,而是在这里让他失望。对于大多数用户,您不会尝试从其他程序中获取例外。 – tdelaney

+0

我找到并可能工作的最佳解决方案(我没有测试它)正在启动一个新的应用程序域的过程。这里以C#为例:https://social.msdn.microsoft.com/Forums/vstudio/en-US/62259e21-3280-4d10-a27c-740d35efe51c/catch-another-process-unhandled-exception?forum=csharpgeneral – cabbi

0

试试这个

cmd = ['C:\\Users\\name\\Desktop\\Win32Project1.exe'] 
out, err = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 
print out # this prints the output of the execution 
print err # this prints if any error is returned 

我没有窗户,所以这不是测试,但可能会帮助您,更多信息看看here

0

您也可以将其他参数传递给subprocess.Popen,以指定stdin和stderr的位置。

那么你可以说东西这样的:

p = subprocess.Popen('C:\\Users\\name\\Desktop\\Win32Project1.exe', stdout=PIPE, stderr=PIPE) 
(stdout_data, stderr_data) = p.communicate() 

rc = p.returncode 

# assume 0 return code means o.k. 
if rc: 
    parse_error(stderr_data) 
    # end if