与Python3中的进程ID混淆

与Python3中的进程ID混淆,python,linux,ubuntu,process,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', c

我有一个
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与我们从内部子进程获得的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
如果直接执行
runner.py
,您将获得
runner.py
,作为
main.py
的子级(而不将其作为
/usr/bin/python3
的参数运行):

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


另一方面,试着使用
子进程.run
包装器,而不是直接在
子进程.Popen
(和兄弟们)。

我试过.run(),但它占据了主进程,所以没有打印出来,而且它永远不会被杀死。@Donnguyen
run
API与
Popen
有点不同。您应该仔细阅读文档以使其符合您的需要:)即使我将chmod runner.py作为可执行脚本直接运行它,它仍然需要创建另一个进程id。不过,我理解这里的原因,这可以通过一个小技巧解决。
child_process = subprocess.Popen('./runner.py', shell=True)