Захват кода Python Sys.Exit с помощью CreateProcessW - PullRequest
0 голосов
/ 25 января 2019

Я написал C ++ GUI, который генерирует скрипты Python и вызывает python.exe через CreateProcessW.Однако у меня возникают проблемы с чтением кода sys.exit из моего скрипта на Python на C ++.

В 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).Есть ли другой способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Возвращаемое значение 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
    }
}
0 голосов
/ 25 января 2019

Это одно и то же значение независимо от того, есть ли в скрипте ошибки и дроссели Python, или если он успешно работает до sys.exit (1).

Ну да. 1 - код завершения, возвращаемый при выходе Python из необработанного исключения. 1 означает, что произошла ошибка.

Если вы хотите указать успешность, код завершения для этого равен 0. Это код завершения по умолчанию, если вы позволяете Python выполнить свой скрипт до завершения, или если вы делаете sys.exit() без аргумента. Вы также можете сделать sys.exit(0) явно, если хотите.


Кроме того, WaitForSingleObject не возвращает код выхода. Похоже, что функция для получения кодов выхода: GetExitCodeProcess.

...