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

1989年

我有一个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
pil

我相信您在UNIX / Linux上。如果我可以重申您的问题,我想您是在问

p = subprocess.Popen("python test.py", shell=True)

为什么p.pidtest.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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python的Subprocess.Popen with Shell = True。等到完成

来自分类Dev

Python的Subprocess.Popen with Shell = True。等到完成

来自分类Dev

在Python中使用subprocess.Popen执行shell脚本?

来自分类Dev

Python subprocess.popen错误的pid

来自分类Dev

Python subprocess.Popen 错误处理 shell=True/False 问题

来自分类Dev

使用subprocess.Popen()从bash shell转换为python3

来自分类Dev

Python Popen Shell脚本但失败

来自分类Dev

subprocess.Popen没有运行shell命令

来自分类Dev

Python-使用subprocess.Popen杀死挂起的进程

来自分类Dev

使用python subprocess.Popen的僵尸SSH进程

来自分类Dev

Python:使用subprocess.call而不是Popen获取输出

来自分类Dev

使用Shell = False的Popen执行python脚本

来自分类Dev

Python popen shell命令等到子进程完成

来自分类Dev

在Python 2.5中使用subprocess.Popen访问子进程创建的文件描述符

来自分类Dev

如何在Python中使用subprocess.Popen()而不是os.popen()?

来自分类Dev

为什么`subprocess.Popen`返回不同的输出到shell?-Windows

来自分类Dev

使用subprocess.Popen()和手动在shell中运行命令之间的区别?

来自分类Dev

Python subprocess.popen()无需等待

来自分类Dev

Python subprocess.Popen()等待完成

来自分类Dev

Redirecting stdout to stderr in Python's subprocess/Popen

来自分类Dev

Python Subprocess.Popen和rdesktop

来自分类Dev

Python Subprocess.Popen属性错误?

来自分类Dev

subprocess.Popen中的Python重定向

来自分类Dev

Python - subprocess.Popen 不返回输出

来自分类Dev

如何使用subprocess.call从Python Shell exec拦截stdout?

来自分类Dev

Python使用subprocess.Popen关闭所有线程或进程

来自分类Dev

Python使用subprocess.Popen关闭所有线程或进程

来自分类Dev

Subprocess.Popen与.call:使用python从Shell脚本调用C可执行文件的正确方法是什么,其中所有6个作业都可以并行运行

来自分类Dev

Python:subprocess.Popen()。communicate()将SSH命令的输出打印到stdout,而不是返回输出

Related 相关文章

  1. 1

    Python的Subprocess.Popen with Shell = True。等到完成

  2. 2

    Python的Subprocess.Popen with Shell = True。等到完成

  3. 3

    在Python中使用subprocess.Popen执行shell脚本?

  4. 4

    Python subprocess.popen错误的pid

  5. 5

    Python subprocess.Popen 错误处理 shell=True/False 问题

  6. 6

    使用subprocess.Popen()从bash shell转换为python3

  7. 7

    Python Popen Shell脚本但失败

  8. 8

    subprocess.Popen没有运行shell命令

  9. 9

    Python-使用subprocess.Popen杀死挂起的进程

  10. 10

    使用python subprocess.Popen的僵尸SSH进程

  11. 11

    Python:使用subprocess.call而不是Popen获取输出

  12. 12

    使用Shell = False的Popen执行python脚本

  13. 13

    Python popen shell命令等到子进程完成

  14. 14

    在Python 2.5中使用subprocess.Popen访问子进程创建的文件描述符

  15. 15

    如何在Python中使用subprocess.Popen()而不是os.popen()?

  16. 16

    为什么`subprocess.Popen`返回不同的输出到shell?-Windows

  17. 17

    使用subprocess.Popen()和手动在shell中运行命令之间的区别?

  18. 18

    Python subprocess.popen()无需等待

  19. 19

    Python subprocess.Popen()等待完成

  20. 20

    Redirecting stdout to stderr in Python's subprocess/Popen

  21. 21

    Python Subprocess.Popen和rdesktop

  22. 22

    Python Subprocess.Popen属性错误?

  23. 23

    subprocess.Popen中的Python重定向

  24. 24

    Python - subprocess.Popen 不返回输出

  25. 25

    如何使用subprocess.call从Python Shell exec拦截stdout?

  26. 26

    Python使用subprocess.Popen关闭所有线程或进程

  27. 27

    Python使用subprocess.Popen关闭所有线程或进程

  28. 28

    Subprocess.Popen与.call:使用python从Shell脚本调用C可执行文件的正确方法是什么,其中所有6个作业都可以并行运行

  29. 29

    Python:subprocess.Popen()。communicate()将SSH命令的输出打印到stdout,而不是返回输出

热门标签

归档