stderr изменяет поведение Python для Popen при закрытии скрипта - PullRequest
1 голос
/ 31 мая 2019

Я использовал этот скрипт на python2, чтобы запустить приложение, а затем немедленно выйти из скрипта python, не дожидаясь завершения дочернего процесса.Это был мой код:

kwargs = {}
if platform.system() == 'Windows':
    # from msdn [1]
    CREATE_NEW_PROCESS_GROUP = 0x00000200  # note: could get it from subprocess
    DETACHED_PROCESS = 0x00000008          # 0x8 | 0x200 == 0x208
    kwargs.update(creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP)
    kwargs.update(stderr=subprocess.PIPE)
elif sys.version_info < (3, 2):  # assume posix
    kwargs.update(preexec_fn=os.setsid)
else:  # Python 3.2+ and Unix
    kwargs.update(start_new_session=True)

subprocess.Popen([APP], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,**kwargs)

Он работает нормально на python 2.7, но не запускает ожидаемое «приложение» на python 3.7 без изменений.

Для того, чтобы заставить его работатьв python3 я нашел два независимых обходных пути:

  1. Измените stderr на это: stderr = подпроцесс.DEVNULL

или

Добавить вызов time.sleep (0.1) после Popen (до закрытия скрипта).

Я предполагаю, что это на самом деле не связанок python, но к какому-либо событию, которое должно произойти после того, как процесс будет открыт, прежде чем скрипт python сможет безопасно завершиться?

Есть какие-нибудь подсказки?Я действительно хотел бы знать, почему это происходит.Прямо сейчас я просто добавил сон звонок.

Спасибо

...