Как отсоединить дочерний процесс Python в Windows (без setsid)? - PullRequest
0 голосов
/ 21 сентября 2018

Я перенесу некоторый код процесса в Windows, который хорошо работал на Posix.Проще говоря: код для запуска подпроцесса и немедленного отключения не будет работать, потому что setsid() недоступен:

import os, subprocess, sys
p = subprocess.Popen([sys.executable, '-c', "print 'hello'"], preexec_fn=os.setsid)

Я могу отменить использование setsid, но тогда дочерний процесс заканчивается, когдародитель заканчивается.

У меня вопрос как мне добиться того же эффекта, что и setsid в Windows, чтобы время жизни дочернего процесса не зависело от родительского процесса?

Iхотел бы использовать конкретный пакет Python, если он существует для такого рода вещей.Например, я уже использую psutil, но не увидел в нем ничего, что могло бы мне помочь.

1 Ответ

0 голосов
/ 21 сентября 2018

Комментарий RbMn к моему вопросу - фактически ответ.Нет необходимости отсоединять, потому что процессы в Windows всегда являются объектами верхнего уровня.Я попробовал это с задачей спящего, и она работала нормально.

Однако , как указал eryksun в комментариях, закрытие окна консоли вызовет завершение дочернего процесса.У меня также были некоторые проблемы со стабильностью работы с Waitress и Popen в Windows, которые я считаю Я прошел, добавив следующий фрагмент кода, который устанавливает флаги создания процесса и использует close_fds:

if 'nt' == os.name:
     flags = 0
     flags |= 0x00000008  # DETACHED_PROCESS
     flags |= 0x00000200  # CREATE_NEW_PROCESS_GROUP
     flags |= 0x08000000  # CREATE_NO_WINDOW

     pkwargs = {
         'close_fds': True,  # close stdin/stdout/stderr on child
         'creationflags': flags,
     }

 p = subprocess.Popen([sys.executable, '-c', cmd], **pkwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...