2016-12-27 1 views
0

На сервере Windows, я начинаю subprocs от основного сценария с консольным окном и добавить его в список проков, так что я могу закрыть их:Python подпроцесс CREATE_NEW_CONSOLE Windows, не закрывая на убийстве()

p = Popen(["python", 'secondscript.py', arg1, arg2, arg3], creationflags=CREATE_NEW_CONSOLE) 
Proc.append(p) 

Позже, если я убить проки с:

for p in Proc: 
    p.kill() 

Они, кажется, перестают работать, но я получаю налево с консольными окнами, оставшихся открытыми. Сама по себе это не огромная сделка, но может со временем складываться и начинать создавать проблемы.

Жизнь намного проще с использованием нового флага консоли, но есть ли более аккуратный способ убедиться, что окна консоли закрыты правильно? Я мог бы полагаться на taskkill из OS lib, возможно, но это не похоже на хороший способ сделать это.

У меня был взгляд вокруг, похоже, что у некоторых людей возникли проблемы на серверах Linux и пришлось отправить сигкилл, но я подумал, что это то, что должен был сделать kill().

Возможно, мне просто нужно будет использовать kill(), чтобы остановить его работу, а затем выполнить задание, чтобы получить порядок, но я был бы признателен за любой совет, если есть более простой способ сделать это.

+0

аккуратнее путь передать сокет в дочерний процесс, чтобы отправить ему сообщение о выходе. Таким образом, он может выйти изящно. Вызов «TerminateProcess» должен быть последним средством в целом, потому что он вытаскивает ковер из-под программы. Это эквивалент 'SIGKILL' в Unix. – eryksun

ответ

0

Возможно, я неправильно читаю .terminate() и .kill() работают по-другому. Кажется, что Terminate() делает трюк правильно.

+0

В Windows 'kill' это просто псевдоним для' terminate'. Что бы ни изменилось, это не так. – eryksun

0

Я была такая же проблема (на окнах), и я нашел где-то в SO (к сожалению, это было некоторое время назад) следующую команду:

proc_class = subprocess.Popen(r"C:blabla\server.bat", creationflags=CREATE_NEW_CONSOLE) 

... do some stuff ... 

Popen("TASKKILL /F /PID {} /T".format(proc_class.pid)) 

и он работает довольно хорошо

Смежные вопросы