我试图模仿QProcess中的以下命令行,但我不知道如何使用QProcess传递/发送control-c。任何帮助将不胜感激:
注意:不能使用QProcess.kill(),QProcess.terminate()
#!/usr/bin/python
import sys, time
def main(argv):
print ('enter main')
time.sleep(20)
print ('exit main')
if __name__ == "__main__":
main(sys.argv[1:])
命令行看起来像是control-c hit -
C:\>python tt.py
enter main
Traceback (most recent call last):
File "tt.py", line 12, in <module>
main(sys.argv[1:])
File "tt.py", line 8, in main
time.sleep(20)
KeyboardInterrupt
C:\>
答案 0 :(得分:0)
让我们尝试实施基于this answer的解决方案。当前进程的控制台保存在虚拟助手进程中。这不太理想。
理想情况下,我们希望关注this answer,在自己的流程组中创建一个辅助流程,并让它启动所需的流程 - 以便GenerateConsoleCtrlEvent
可以直接发出目标流程的信号搞乱当前的控制台。唉,这需要在PyQt5中支持QProcess:: setCreateProcessArgumentsModifier
- 而这还不可用:(
一种选择是生成一个C ++帮助程序来执行该操作。
import win32console, win32process, win32api, win32con
def signalCtrl(qProcess, ctrlEvent=None)
if ctrlEvent is None:
ctrlEvent = win32con.CTRL_C_EVENT
has_console=False
try:
win32console.AllocConsole()
except win32api.error:
has_console=True
if !has_console:
# free the dummy console
try:
win32console.FreeConsole()
except win32api.error:
return False
if has_console:
# preserve the console in a dummy process
try:
hProc, _, pid, _ = win32process.CreateProcess(
None, "cmd.exe", None, None, True, win32con.DETACHED_PROCESS,
None, 'c:\\', win32process.STARTUPINFO())
win32console.FreeConsole()
except win32api.error:
return False
try:
# attach to the process's console and generate the event
win32console.AttachConsole(qProcess.processId())
# Add a fake Ctrl-C handler for avoid instant kill is this console
win32api.SetConsoleCtrlHandler(lambda x: True, True)
win32console.GenerateConsoleCtrlEvent(ctrlEvent, 0)
win32console.FreeConsole()
except win32api.error:
return False
if !has_console:
# we have no console to restore
return True
try:
# attach to the dummy process's console and end the process
win32console.AttachConsole(pid)
win32process.TerminateProcess(hProc, 1)
except win32api.error:
return False
return True
这是非常未经测试的。