我有一个 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与我们从子进程内部得到的不一样?
最佳答案
您正在将脚本作为 /usr/bin/python3 ./runner.py
运行,即作为 /usr/bin/python3
的参数,因此 PID 树变成:
main.py
:父级:PID=16350/usr/bin/python3
:main.py
的子进程(子进程):PID=16351runner.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/