与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树变为:
:父项:PID=16350main.py
:main.py的子进程:PID=16351/usr/bin/python3
:孙子到runner.py
,子到main.py
:PID=16352/usr/bin/python3
runner.py
,您将获得runner.py
,作为main.py
的子级(而不将其作为/usr/bin/python3
的参数运行):
显然,在直接执行之前,需要使runner.py
可执行
另一方面,试着使用
子进程.run
包装器,而不是直接在子进程.Popen
(和兄弟们)。我试过.run(),但它占据了主进程,所以没有打印出来,而且它永远不会被杀死。@Donnguyenrun
API与Popen
有点不同。您应该仔细阅读文档以使其符合您的需要:)即使我将chmod runner.py作为可执行脚本直接运行它,它仍然需要创建另一个进程id。不过,我理解这里的原因,这可以通过一个小技巧解决。
child_process = subprocess.Popen('./runner.py', shell=True)