В python 2.7 в Windows в соответствии с документацией вы можете отправить CTRL_C_EVENT (документация по Python 2.7 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.Этот сигнал не может быть сгенерирован для групп процессов
Следующий сайт предоставляет больше информации о флагах создания: Флаги создания процесса.