![](/img/trans.png)
[英]Python subprocess.Popen get pid of the process that forks a process
[英]pid of a process created by python subprocess.Popen(shell=True) is not the pid of the spawned shell
我有一個用於測試的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
進程的p.pid
相同,而不是介入的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
s表示命令,替換本身-而不是它的PID,當然-與新工藝。 所以,家譜看起來像這樣:
python (calling Popen) # pid 201
\_ /bin/sh -c ... --execve--> python test.py # pid 202
在Linux上你可以strace -fe trace=process ...
來確認這一點。 您將看到頂級python進程fork(呃, clone
),然后子進程將執行/bin/sh
然后再進行python
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.