簡體   English   中英

python subprocess.Popen(shell = True)創建的進程的pid不是生成的shell的pid

[英]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.pidtest.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM