Я прочитал так много вопросов по stackoverflow, но они слишком старые и мне не помогают. У меня есть подпроцесс, и я хочу отправить сигнал CTRL_C_EVENT, чтобы остановить его. Я не хочу убивать его напрямую. Вот мой код:
import subprocess
import os
import signal
CREATE_NO_WINDOW = 0x08000000
'''
I tried these too but i failed.
creationflags=CREATE_NO_WINDOW | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS
CREATE_NEW_PROCESS_GROUP = 0x00000200
DETACHED_PROCESS = 0x00000008
'''
cmd = 'my cmd arguments'
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True,shell=True,creationflags=CREATE_NO_WINDOW)
test = 0
for line in process.stdout:
test += 1
if (test > 60):
os.kill(process.pid, signal.CTRL_C_EVENT)
#This fails too
#process.send_signal(signal.CTRL_C_EVENT)
else:
print(line)
Здесь исключение:
OSError: [WinError 6] The handler is invalid
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\xxxxxxx\Desktop\xxxxx\test subprocess.py", line 16, in <module>
os.kill(process.pid, signal.CTRL_C_EVENT)
SystemError: <built-in function kill> returned a result with an error set






Я ожидаю, что это потому, что ваш процесс все еще используется из-за for line in process.stdout:
Возможно, вам придется сначала выйти из цикла for, тогда отправить CTRL_C_EVENT сигнал, чтобы остановить его
Попробуйте что-нибудь подобное:
import subprocess
import os
import signal
CREATE_NO_WINDOW = 0x08000000
'''
I tried these too but i failed.
creationflags=CREATE_NO_WINDOW | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS
CREATE_NEW_PROCESS_GROUP = 0x00000200
DETACHED_PROCESS = 0x00000008
'''
cmd = 'my cmd arguments'
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True,shell=True,creationflags=CREATE_NO_WINDOW)
test = 0
CTRL_C_EVENT_is_required=False
for line in process.stdout:
test += 1
if (test > 60):
CTRL_C_EVENT_is_required=True
break
else:
print(line)
if CTRL_C_EVENT_is_required==True:
os.kill(process.pid, signal.CTRL_C_EVENT)
Я все еще получаю ту же ошибку. Я попробовал time.sleep (20) и тоже отправил сигнал os.kill ctrl_cl_event, но результат тот же.