与Python 3中的进程ID混淆

时间:2019-01-25 08:20:30

标签: 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与我们从内部子进程获得的ID不同?

1 个答案:

答案 0 :(得分:2)

您以/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

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

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

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

顺便说一句,请尝试使用subprocess.run包装器,而不是直接在subprocess.Popen(和兄弟)附近捣蛋。