【问题标题】:subprocess has wrong pid on Windows子进程在 Windows 上的 pid 错误
【发布时间】:2020-11-17 23:07:44
【问题描述】:

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 测试中的sys.executable 是什么?
  • C:\my-venv\Scripts\python.exe(main.py 和 sub.py 的输出相同)
  • @Chris 应该进入你的问题本身,而不是评论
  • 这可能是子进程启动另一个子进程的情况,尽管我对 Windows Python 启动器了解得不够多,不知道为什么会发生这种情况。
  • @user2357112supportsMonica - 我也在想同样的事情,就像涉及某种包装脚本一样。虽然......如果是Linux,在那种情况下这两个数字不会接近吗?我一般对Window不太了解,可能在Windows上也不是这样。

标签: python subprocess python-3.7


【解决方案1】:

在 windows 上创建虚拟环境时,复制到 venv 的 Script 文件夹的 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() 将返回它自己的 pid,但在虚拟环境中执行时它有一个父进程。但是,当 venv 停用时,main 和 sub.py 会报告相同的 pid。

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 2013-05-19
    • 2015-08-21
    • 2018-12-14
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2013-04-03
    • 2018-07-29
    相关资源
    最近更新 更多