Как добиться желаемых результатов при использовании подпроцессов Popen.send_signal (CTRL_C_EVENT) в Windows?

В python 2.7 в Windows, согласно документации, вы можете отправить CTRL_C_EVENT (документация Python 2.7 Subprocess Popen.send_signal). Однако когда я попробовал это, я не получил ожидаемого прерывания клавиатуры в подпроцессе.

Это пример кода для родительского процесса:

# 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?

Прочитав, я обнаружил некоторую информацию, которая, кажется, противоречит документации python относительно CTRL_C_EVENT, в частности, там говорится, что

CTRL_C_EVENT 0 Генерирует сигнал CTRL + C. Этот сигнал не может быть сгенерирован для групп процессов

На следующем сайте представлена ​​дополнительная информация о флагах создания: Флаги создания процессов.

5
задан Garen 20 January 2012 в 00:34
поделиться