【问题标题】:Confused with process IDs in Python 3与 Python 3 中的进程 ID 混淆
【发布时间】:2019-01-25 08:20:29
【问题描述】:

我有一个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 给出以下结果:

为什么我们从main.py得到的子进程的id和我们从里面的子进程得到的不一样?

【问题讨论】:

    标签: python linux ubuntu process


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我试过 .run(),但它占据了主进程,所以没有打印出来,而且它永远不会被杀死。
    • @DongNguyen run API 与 Popen 有点不同。您应该彻底阅读文档以使其满足您的需要:)
    • 即使我 chmod runner.py 作为可执行脚本,直接运行它,它仍然会创建另一个进程 ID。但是我理解这里的原因,可以通过一个小技巧来解决。
    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2015-05-29
    相关资源
    最近更新 更多