我有一个python脚本进行测试:
test.py:
#coding=utf-8
import os
import time
print os.getpid()
通过subprocess.Popen调用它:
p = sp.Popen("python test.py", shell=True)
print p.pid
预期这两个print语句的不同输出,因为p.pid应该是生成的shell进程的pid,但是实际输出是:
In [18]: p = sp.Popen("python test.py", shell=True)
In [19]: 19108
In [19]: p.pid
Out[19]: 19108
我相信您在UNIX / Linux上。如果我可以重申您的问题,我想您是在问
p = subprocess.Popen("python test.py", shell=True)
为什么p.pid
与test.py
过程的shell而不是中间的shell相同,您明确要求了哪个shell?也就是说,您希望过程谱系看起来像这样:
python (calling subprocess.Popen) # pid 123
\_ /bin/sh -c 'python test.py' # pid 124
\_ python test.py # pid 125 # note: pids need not be sequential, that's just for demonstration
答案是,您的外壳正在进行优化。Shell意识到已经给了它一个简单的命令,只需execve
将该命令替换为新过程即可,而不是其PID。因此,族谱如下所示:
python (calling Popen) # pid 201
\_ /bin/sh -c ... --execve--> python test.py # pid 202
在Linux上,您可以strace -fe trace=process ...
确认这一点。您将看到顶级python进程fork(er,clone
),然后该子进程将执行/bin/sh
,然后再次执行python
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句