python - 与 Python 3 中的进程 ID 混淆

标签 python linux ubuntu process

我有一个 main.py 如下:

#!/usr/bin/env python3

import time
import os
import subprocess

fs = './runner.py'
child_process = subprocess.Popen(
    '/usr/bin/python3 ' + fs,
    shell=True
)


print('main process pid', os.getpid())
print('sub process pid', child_process.pid)
time.sleep(10)
os.system('kill ' + str(child_process.pid))

runner.py:

#!/usr/bin/env python3

import os
import time

TIME_TO_CHECK_STATUS = 1


def init():
    pid = os.getpid()
    print('inside child process:')
    print(' --> pid: ', pid)
    def check():
        time.sleep(TIME_TO_CHECK_STATUS)
        check()
        return pid

    return check()


if __name__ == '__main__':
    init()

在终端中运行 main.py 给出以下结果:

enter image description here

为什么我们从main.py得到的子进程的id与我们从子进程内部得到的不一样?

最佳答案

您正在将脚本作为 /usr/bin/python3 ./runner.py 运行,即作为 /usr/bin/python3 的参数,因此 PID 树变成:

  • main.py:父级:PID=16350
  • /usr/bin/python3:main.py 的子进程(子进程):PID=16351
  • runner.py:main.py 的孙子,/usr/bin/python3 的子代:PID=16352

如果直接执行它(而不将其作为 /usr/bin/的参数运行),您将获得 runner.py 作为 main.py 的子级python3):

child_process = subprocess.Popen('./runner.py', shell=True)

显然,在直接执行之前,您需要使 runner.py 可执行。

顺便说一句,尝试使用 subprocess.run 包装器,而不是直接破坏 subprocess.Popen (和兄弟)。

关于python - 与 Python 3 中的进程 ID 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54361420/

相关文章:

php - 能够从Windows连接到Linux上的mysql数据库的步骤是什么

docker - 无根 docker-compose 无法构建时间刻度图像

python - 使用 Python 运行外部应用程序并在内部调用它们的方法

node.js - Ubuntu 12.04 上的 Node npm 问题

python - twisted+wxPython 存在不干净的情况

python - 识别 Pandas DataFrame 中的前导和尾随 NA

c - 使用带有多个参数的 execlp 运行 linux 命令作为 c 中的字符串

python - 你如何将星级评分作为可视化

javascript - 我可以在 Python 和 NodeJS 中使用同一个 MongoDB 数据库吗

linux - 将文件从远程服务器复制到本地服务器不起作用