在Windows中使用子程序Popen.send_signal(CTRL_C_EVENT)时如何获得所需的结果?

前端之家收集整理的这篇文章主要介绍了在Windows中使用子程序Popen.send_signal(CTRL_C_EVENT)时如何获得所需的结果?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在根据文档的Windows中的python 2.7中,您可以发送CTRL_C_EVENT
(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的说明.

catcher.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'
原文链接:https://www.f2er.com/windows/372149.html

猜你在找的Windows相关文章