在根据文档的Windows中的python 2.7中,您可以发送CTRL_C_EVENT
(Python 2.7 Subprocess Popen.send_signal documentation).
但是,当我尝试它时,我没有在子进程中收到预期的键盘中断.
(Python 2.7 Subprocess Popen.send_signal documentation).
但是,当我尝试它时,我没有在子进程中收到预期的键盘中断.
这是父进程的示例代码:
# FILE : parentProcess.py import subprocess import time import signal CREATE_NEW_PROCESS_GROUP = 512 process = subprocess.Popen(['python','-u','childProcess.py'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,universal_newlines=True,creationflags=CREATE_NEW_PROCESS_GROUP) print "pid = ",process.pid index = 0 maxLoops = 15 while index < maxLoops: index += 1 # Send one message every 0.5 seconds time.sleep(0.5) # Send data to the subprocess process.stdin.write('Bar\n') # Read data from the subprocess temp = process.stdout.readline() print temp,if (index == 10): # Send Keyboard Interrupt process.send_signal(signal.CTRL_C_EVENT)
这是子程序的示例代码:
# FILE : childProcess.py import sys while True: try: # Get data from main process temp = sys.stdin.readline() # Write data out print 'Foo ' + temp,except KeyboardInterrupt: print "KeyboardInterrupt"
如果我运行文件parentProcess.py我希望得到“Foo Bar”十次,然后是“KeyboardInterrupt”,接着是“Foo Bar”4次,但我得到“Foo Bar”15次.
有没有办法让CTRL_C_EVENT表现为键盘中断,就像SIGINT在Linux中的表现一样?
做了一些阅读后,我发现一些信息似乎与关于CTRL_C_EVENT的python文档相矛盾,特别是它说
CTRL_C_EVENT
0 Generates a CTRL+C signal. This signal cannot be generated for process groups
以下站点提供了有关创建标志的更多信息:
Process Creation Flags.
这个子进程信号处理方法在Linux和Windows 2008上都适用于我,它们都使用Python 2.7.2,但它使用Ctrl-Break而不是Ctrl-C.请参阅
http://msdn.microsoft.com/en-us/library/ms683155%28v=vs.85%29.aspx中有关进程组和Ctrl-C的说明.
原文链接:https://www.f2er.com/windows/372149.htmlcatcher.py:
import os import signal import sys import time def signal_handler(signal,frame): print 'catcher: signal %d received!' % signal raise Exception('catcher: i am done') if hasattr(os.sys,'winver'): signal.signal(signal.SIGBREAK,signal_handler) else: signal.signal(signal.SIGTERM,signal_handler) print 'catcher: started' try: while(True): print 'catcher: sleeping...' time.sleep(1) except Exception as ex: print ex sys.exit(0)
thrower.py:
import signal import subprocess import time import os args = [ 'python','catcher.py',] print 'thrower: starting catcher' if hasattr(os.sys,'winver'): process = subprocess.Popen(args,creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) else: process = subprocess.Popen(args) print 'thrower: waiting a couple of seconds for catcher to start...' time.sleep(2) print 'thrower: sending signal to catch' if hasattr(os.sys,'winver'): os.kill(process.pid,signal.CTRL_BREAK_EVENT) else: process.send_signal(signal.SIGTERM) print 'thrower: i am done'