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