V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2019-07-26 11:12:55 +08:00 · 3989 次点击
    这是一个创建于 1977 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教,python 执行外部程序,并且获取外部程序的 pid。目前操作获取到的都是 python 的 pid 以及 cmd 的 pid,获取不到运行了的外部程序的 pid。请教大佬
    21 条回复    2019-09-02 15:25:25 +08:00
    linxiaoziruo
        1
    linxiaoziruo  
       2019-07-26 11:14:47 +08:00
    我就纳闷儿了,我啥时候发的这个帖子
    smallpython
        2
    smallpython  
       2019-07-26 11:22:06 +08:00
    自问自答
    太优秀了
    zjb861107
        3
    zjb861107  
       2019-07-26 11:29:58 +08:00
    不是通过 subprocess 创建的子进程吗,子进程的 pid 可以直接拿到啊。
    但是,如果是子进程再创建的子进程,就不一定行了。研究一下进程组试试。
    rj2
        4
    rj2  
    OP
       2019-07-26 11:33:55 +08:00
    @zjb861107 试了下, 拿到的不是打开的外部程序的 pid
    rj2
        5
    rj2  
    OP
       2019-07-26 11:34:23 +08:00
    @linxiaoziruo 我也懵逼了 吓得我 看了再看看
    SbloodyS
        6
    SbloodyS  
       2019-07-26 11:54:11 +08:00
    执行一下 ps aux 就好了
    est
        7
    est  
       2019-07-26 12:02:34 +08:00
    仔细看文档了么?把文档里你调用的方法的文档复制过来看看 ctrl+f 一下 pid
    www5070504
        8
    www5070504  
       2019-07-26 12:19:02 +08:00
    如果 subprocess 拿不到的话 用 psutil 查询一遍所有进程的名字和试试用父进程 pid 呢
    www5070504
        9
    www5070504  
       2019-07-26 12:19:42 +08:00
    感觉直接用 psutil 查一遍是最省事的了。。
    ysc3839
        10
    ysc3839  
       2019-07-26 13:26:50 +08:00 via Android
    贴代码看看?
    Sylv
        11
    Sylv  
       2019-07-26 13:31:55 +08:00 via iPhone
    哈哈,一楼我没反应过来,还以为楼主精分了。
    chinazz
        12
    chinazz  
       2019-07-26 13:50:57 +08:00
    # 创建进程
    p = subprocess.Popen(cmd_, shell=True, cwd=, stdin=, stdout=, stderr=)
    # 获得 pid
    pid = p.pid
    # 监听
    glan = psutil.Process(pid)
    chinazz
        13
    chinazz  
       2019-07-26 13:51:43 +08:00
    subprocess 是可以拿到 pid 的
    rj2
        14
    rj2  
    OP
       2019-07-26 14:06:53 +08:00
    @chinazz 抱歉, 应该是我的表述有误。就是我想获取的 pid 是子进程运行后再创建的子进程。
    #创建进程
    p = subprocess.Popen('unins000.exe')
    #获取 exe 的 pid
    pid = p.pid
    但是这个 exe 运行后,会有一个进程 pid。请问这个 pid 怎么获取。
    j0hnj
        15
    j0hnj  
       2019-07-26 14:26:15 +08:00
    你这个表达能力真的堪忧…
    你想做的应该是子进程的子进程的 pid, 如果 unins000.exe 不是自己能控制的话,直接通过 subprocess 是拿不到它的子进程的 pid 的,
    只能是用 psutil 遍历全部的 pid, 筛选出 parenet_pid == unins00.exe pid 的那些进程
    j0hnj
        16
    j0hnj  
       2019-07-26 14:26:58 +08:00
    @j0hnj #15 typo: parenet_pid => parent_pid
    rj2
        17
    rj2  
    OP
       2019-07-26 14:33:03 +08:00
    @j0hnj 是的,确实是我的表述问题。嗯,psutil 遍历全部 pid,做筛选。其实我想拿到的是孙进程,我也是刚回过神来。谢了。
    ClericPy
        18
    ClericPy  
       2019-07-26 15:08:05 +08:00
    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
        19
    rj2  
    OP
       2019-07-26 15:22:05 +08:00
    @ClericPy 嗯嗯
    douglas1997
        20
    douglas1997  
       2019-07-26 16:47:11 +08:00
    看到一楼笑出声。
    ranlele
        21
    ranlele  
       2019-09-02 15:25:25 +08:00
    我今天也尝试了这个,当设置 shell=False 时,返回的 pid 为执行 shell 命令之后开启的进程的 pid。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5178 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:50 · PVG 11:50 · LAX 19:50 · JFK 22:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.