子进程在 Windows 上有错误的 pid

subprocess has wrong pid on Windows

main.py:

from subprocess import Popen
import sys

proc = Popen([sys.executable, 'sub.py'])
print('parent thinks subprocess pid is', proc.pid)

sub.py:

import os
print('subprocess thinks its pid is', os.getpid())

python main.py 在 Linux 上的输出:

parent thinks subprocess pid is 338
subprocess thinks its pid is 338

Windows 上的输出:

parent thinks subprocess pid is 17340
subprocess thinks its pid is 7308

这是为什么?

编辑:print(sys.executable) 给出 C:\my-venv\Scripts\python.exe

在 windows 上创建虚拟环境时,复制到 venv 的脚本文件夹的 python 解释器似乎不是实际的 python 可执行文件,而是执行它的包装器。

如果你将sub.py修改成这样:

import os
import psutil
local_pid = os.getpid()
parent = psutil.Process(local_pid).parent()
print('subprocess thinks its pid is', os.getpid())
try:
    print("parent process of our main python is", parent.pid)
except:
    pass

您会看到 os.getpid() 将 return 它自己的 pid,但在虚拟环境中执行时它有一个父进程。但是,当 venv 停用时,main 和 sub.py 会报告相同的 pid。