我能打斷我的子進程在Windows中如何在使用Python C API時在Windows上中斷Python子進程?
import ctypes
ctypes.windll.kernel32.GenerateConsoleCtrlEvent(1, _proc.pid)
,但只有當我通過正常的Python程序運行它。
當運行通過使用Python C API單獨啓動程序相同的代碼(代碼是下面),上面的代碼不具有任何影響。
我應該以某種方式改變我的啓動,以便能夠中斷子進程?
#include <Python.h>
#include <windows.h>
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
LPWSTR *argv;
int argc;
argv = CommandLineToArgvW(GetCommandLine(), &argc);
if (argv == NULL)
{
MessageBox(NULL, L"Unable to parse command line", L"Error", MB_OK);
return 10;
}
Py_SetProgramName(argv[0]);
Py_Initialize();
PySys_SetArgvEx(argc, argv, 0);
PyObject *py_main, *py_dict;
py_main = PyImport_AddModule("__main__");
py_dict = PyModule_GetDict(py_main);
PyObject* result = PyRun_String(
"from runpy import run_module\n"
"run_module('thonny')\n",
Py_file_input,
py_dict,
py_dict
);
int code;
if (!result) {
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
PyObject* valueAsString = PyObject_Str(pvalue);
wchar_t* error_msg = PyUnicode_AsWideCharString(valueAsString, NULL);
MessageBox(0, error_msg, L"Thonny startup error", MB_OK | MB_ICONERROR);
code = -1;
}
else {
code = 1;
}
Py_Finalize();
return code;
}
編輯:原來與pythonw.exe
相同的問題。
除非目標'pid'實際上是一個過程* *組ID,作爲進行了說明,然後'GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,PID)的行爲'是未定義的。實際上,它的作用就像'pid'是0,即它將事件廣播到連接到控制檯的每個進程。你不想那樣。它可能會殺死連接到控制檯的父進程。 – eryksun
至於你的啓動程序,它根本沒有連接到控制檯,所以我不明白你爲什麼會認爲'GenerateConsoleCtrlEvent'會起作用。 – eryksun
最好的辦法是使用真實的IPC,例如一個命名的事件對象。 (當然,我不知道如何在Python中做到這一點)。 –