如何在QProcess

时间:2018-05-21 15:56:16

标签: c++ qt controls qprocess

我试图模仿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:\>

1 个答案:

答案 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

这是非常未经测试的。