我编写了一个C ++ GUI,该GUI生成python脚本并通过CreateProcessW调用python.exe。但是我在用C ++从我的python脚本读取sys.exit代码时遇到了麻烦。
在Python中,我有:
import sys
...code snippets...
sys.exit(1)
在C ++中,我有:
if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()),
pwszParam, 0, 0, false,
CREATE_DEFAULT_ERROR_MODE, 0, 0,
&siStartupInfo, &piProcessInfo) != false)
{
/* Watch the process. */
dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000));
}
但是dwExitCode(DWORD)似乎没有我想要的东西。无论脚本是否有错误和Python阻塞,或者脚本是否一直成功运行到sys.exit(1),它的值都是相同的。还有其他方法可以实现这一目标吗?
答案 0 :(得分:1)
无论脚本是否有错误和Python阻塞,或者脚本是否一直成功运行到sys.exit(1),它的值都是相同的。
是的,是的。 Python退出未处理的异常时返回的退出代码为1。 1表示有错误。
如果要表示成功,则该退出代码为0。这是默认退出代码,如果您让Python执行脚本完成操作,或者不使用任何参数执行sys.exit()
。如果需要,您也可以明确进行sys.exit(0)
。
除此之外,WaitForSingleObject
不会返回退出代码。看来获取退出代码的功能是GetExitCodeProcess
。
答案 1 :(得分:0)
返回值WaitForSingleObject
仅指示对象是否正在等待实际更改的状态。它是值WAIT_ABANDONED
,WAIT_OBJECT_0
,WAIT_TIMEOUT
或WAIT_FAILED
之一。
如果要获取进程的退出代码,则需要调用GetExitCodeProcess
:
if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()),
pwszParam, 0, 0, false,
CREATE_DEFAULT_ERROR_MODE, 0, 0,
&siStartupInfo, &piProcessInfo))
{
/* Watch the process. */
if (WAIT_OBJECT_0 == WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000)))
{
if (!GetExitCodeProcess(piProcessInfo.hProcess, &dwExitCode))
{
// Handle error
}
}
else
{
// Handle error
}
}