我有一个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不同?
答案 0 :(得分:2)
您以/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
的参数运行),您将把main.py
作为/usr/bin/python3
的子代:
child_process = subprocess.Popen('./runner.py', shell=True)
显然,您需要使runner.py
可执行,然后直接执行。
顺便说一句,请尝试使用subprocess.run
包装器,而不是直接在subprocess.Popen
(和兄弟)附近捣蛋。