推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
rj2
V2EX  ›  Python

请教, Python 执行外部程序,并且获取外部程序的 pid

  •  
  •   rj2 · Jul 26, 2019 · 5152 views
    This topic created in 2660 days ago, the information mentioned may be changed or developed.
    请教,python 执行外部程序,并且获取外部程序的 pid。目前操作获取到的都是 python 的 pid 以及 cmd 的 pid,获取不到运行了的外部程序的 pid。请教大佬
    21 replies  •  2019-09-02 15:25:25 +08:00
    linxiaoziruo
    linxiaoziruo
    Jul 26, 2019
    1
    我就纳闷儿了,我啥时候发的这个帖子
    smallpython
    smallpython
    Jul 26, 2019
    2
    自问自答
    太优秀了
    edsion996
    edsion996
    Jul 26, 2019
    3
    不是通过 subprocess 创建的子进程吗,子进程的 pid 可以直接拿到啊。
    但是,如果是子进程再创建的子进程,就不一定行了。研究一下进程组试试。
    rj2
    rj2
    OP
    Jul 26, 2019
    4
    @zjb861107 试了下, 拿到的不是打开的外部程序的 pid
    rj2
    rj2
    OP
    Jul 26, 2019
    5
    @linxiaoziruo 我也懵逼了 吓得我 看了再看看
    SbloodyS
    SbloodyS
    Jul 26, 2019
    6
    执行一下 ps aux 就好了
    est
    est
    Jul 26, 2019
    7
    仔细看文档了么?把文档里你调用的方法的文档复制过来看看 ctrl+f 一下 pid
    www5070504
    www5070504
    Jul 26, 2019
    8
    如果 subprocess 拿不到的话 用 psutil 查询一遍所有进程的名字和试试用父进程 pid 呢
    www5070504
    www5070504
    Jul 26, 2019
    9
    感觉直接用 psutil 查一遍是最省事的了。。
    ysc3839
    ysc3839
    Jul 26, 2019 via Android
    10
    贴代码看看?
    Sylv
    Sylv
    Jul 26, 2019 via iPhone
    11
    哈哈,一楼我没反应过来,还以为楼主精分了。
    chinazz
    chinazz
    Jul 26, 2019
    12
    # 创建进程
    p = subprocess.Popen(cmd_, shell=True, cwd=, stdin=, stdout=, stderr=)
    # 获得 pid
    pid = p.pid
    # 监听
    glan = psutil.Process(pid)
    chinazz
    chinazz
    Jul 26, 2019
    13
    subprocess 是可以拿到 pid 的
    rj2
    rj2
    OP
    Jul 26, 2019
    14
    @chinazz 抱歉, 应该是我的表述有误。就是我想获取的 pid 是子进程运行后再创建的子进程。
    #创建进程
    p = subprocess.Popen('unins000.exe')
    #获取 exe 的 pid
    pid = p.pid
    但是这个 exe 运行后,会有一个进程 pid。请问这个 pid 怎么获取。
    j0hnj
    j0hnj
    Jul 26, 2019
    15
    你这个表达能力真的堪忧…
    你想做的应该是子进程的子进程的 pid, 如果 unins000.exe 不是自己能控制的话,直接通过 subprocess 是拿不到它的子进程的 pid 的,
    只能是用 psutil 遍历全部的 pid, 筛选出 parenet_pid == unins00.exe pid 的那些进程
    j0hnj
    j0hnj
    Jul 26, 2019
    16
    @j0hnj #15 typo: parenet_pid => parent_pid
    rj2
    rj2
    OP
    Jul 26, 2019
    17
    @j0hnj 是的,确实是我的表述问题。嗯,psutil 遍历全部 pid,做筛选。其实我想拿到的是孙进程,我也是刚回过神来。谢了。
    ClericPy
    ClericPy
    Jul 26, 2019
    18
    for proc in psutil.process_iter():
    try:
    pname = proc.name()

    我是用这种方法 kill 东西的, 用 psutil 的好处是兼容 linux / win

    这里贴代码缩进真淡腾... 简单的说就是 psutil 去找匹配的进程, 然后杀之, 平时用 subprocess 里的那种 kill 在部分场景如果不小心可能会搞出僵尸进程 /孤儿进程什么的, linux 上还得设置 close_fds 什么的, 不如 psutil 简单

    https://github.com/ClericPy/ichrome/blob/master/ichrome/base.py#L335
    rj2
    rj2
    OP
    Jul 26, 2019
    19
    @ClericPy 嗯嗯
    douglas1997
    douglas1997
    Jul 26, 2019
    20
    看到一楼笑出声。
    ranlele
    ranlele
    Sep 2, 2019
    21
    我今天也尝试了这个,当设置 shell=False 时,返回的 pid 为执行 shell 命令之后开启的进程的 pid。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1169 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 23:56 · PVG 07:56 · LAX 15:56 · JFK 18:56
    ♥ Do have faith in what you're doing.