子进程在 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。
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。