Попен создает еще один процесс в венве - PullRequest
1 голос
/ 18 апреля 2020

Popen создает один дополнительный процесс в venv, если я использую sys.executable.

См. Следующие сценарии:

# parent.py

import time
import os
import sys
import psutil


def print_process(proc=None, depth=0):
    if proc is None:
        proc = psutil.Process(os.getpid())
    print(' ' *depth + str(proc.pid))
    children = proc.children()
    for ch in children:
        if ch.pid == proc.pid:
            break
        print_process(ch, depth+2)


def startChild():
    python_executable = sys.executable
    # python_executable = 'python'      # UNCOMMENT this line

    commandLine = [python_executable, 'child.py']
    print(f'Child starter command: {commandLine}')
    app = psutil.Popen(commandLine)
    time.sleep(.1)
    child_pid = app.pid
    print(f"PARENT: Child's pid: {child_pid}")


if __name__ == '__main__':
    print(f'PARENT started! PID: {os.getpid()}')
    startChild()

    print('PARENT: pid tree:')
    print_process()
    time.sleep(1)
# child.py

import os
import time

print(f'CHILD started! PID: {os.getpid()}')
time.sleep(1)

Выполнить parent.py:

(stack_venv) D:\stack>parent.py
PARENT started! PID: 18068
CHILD has started! PID: 13748                 <--- This is weird
PARENT: Child's pid: 19460                    <--- This is weird
PARENT: pid tree:
18068
  19460
    13748

Проблема в том, что ребенок и родитель видят pid ребенка по-разному.

Для воспроизведения необходимо:

  • Выполнить в python3 's venv ( не в наследство virtualenv)
  • Позвоните ребенку с sys.executable
  • Используйте Windows (я не могу воспроизвести на WSL)

Следующие Не забудьте воспроизвести:

  • Пакет создания подпроцесса. Вы можете использовать win32process или subprocess

Я использую:

  • Win 10.0.19041 Build 19041
  • Python 3.7.5
...