V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
reaCodes
V2EX  ›  程序员

请问 Python 用 Subprocess 启动程序,程序启动了两个进程,如何获得这两个进程的 PID

  •  
  •   reaCodes ·
    zhatlas · 2020-05-24 19:06:22 +08:00 · 2445 次点击
    这是一个创建于 1643 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 Subprocess.Popen 只能获得其中一个进程的 PID
    17 条回复    2020-05-24 21:08:38 +08:00
    ipwx
        1
    ipwx  
       2020-05-24 19:09:10 +08:00
    proc = subprocess.Popen(...)
    proc.pid

    不行嘛?
    reaCodes
        2
    reaCodes  
    OP
       2020-05-24 19:10:33 +08:00
    @ipwx 只能获得一个进程的 pid,我不知道怎么获得多进程的 pid
    ipwx
        3
    ipwx  
       2020-05-24 19:12:23 +08:00
    @reaCodes 。。。。

    proc1 = subprocess.Popen(...)
    proc2 = subprocess.Popen(...)

    我不懂你哪里不懂。。。
    AX5N
        4
    AX5N  
       2020-05-24 19:19:28 +08:00
    什么叫做 2 个进程,是 2 个无关的进程?那你不能写成两句话么。还是进程会启动子进程?
    reaCodes
        5
    reaCodes  
    OP
       2020-05-24 19:19:47 +08:00
    ![微信截图_20200524191639.png]( )

    你看我 start 了第一个程序,但是这个程序引起了另外一个进程,我只能获得这个被引起的进程的 pid,也就是第二个进程的 pid,获得不了主进程的 pid,我用 psutil.ppid 获得父进程的 pid 也是不对的
    reaCodes
        6
    reaCodes  
    OP
       2020-05-24 19:20:09 +08:00
    @AX5N 应该是进程会引发子进程
    reaCodes
        7
    reaCodes  
    OP
       2020-05-24 19:20:34 +08:00
    @ipwx 麻烦你看看我的五楼
    reaCodes
        8
    reaCodes  
    OP
       2020-05-24 19:21:37 +08:00
    @AX5N 引发的子进程,然后用子进程的 pid 找父进程的 pid,也是不正确的,用的 psutil.ppid
    AX5N
        9
    AX5N  
       2020-05-24 19:24:04 +08:00
    @reaCodes 试下 psutil 这个库
    ipwx
        10
    ipwx  
       2020-05-24 19:25:56 +08:00
    @reaCodes 不熟悉 windows 。这只能调用 windows api 了,超出了普通程序模型的范畴。或者某个库帮你封装好一个?比如 psutil 这个也许可用:

    https://psutil.readthedocs.io/en/latest/#psutil.Process.children
    reaCodes
        11
    reaCodes  
    OP
       2020-05-24 19:26:10 +08:00
    @AX5N 我找到的父进程竟然是 python.exe
    AX5N
        12
    AX5N  
       2020-05-24 19:28:24 +08:00
    @reaCodes
    ```
    process = psutil.Process(parent_pid)
    child = process.children(recursive=True)
    for i in child:
    print(i)
    ```
    reaCodes
        13
    reaCodes  
    OP
       2020-05-24 19:39:16 +08:00
    @AX5N 请问 subprocess 有没有办法在新窗口启动程序,命令行程序,不然每次启动程序都是在当前窗口启动
    AX5N
        14
    AX5N  
       2020-05-24 19:44:00 +08:00
    @reaCodes `subprocess.Popen("cmd.exe", creationflags = subprocess.CREATE_NEW_CONSOLE)`
    reaCodes
        15
    reaCodes  
    OP
       2020-05-24 19:50:49 +08:00
    @AX5N 哇有效,感谢,解决了我一个很大的问题
    ClericPy
        16
    ClericPy  
       2020-05-24 20:43:33 +08:00
    用 psutil 迭代出来挨个排除吧... 我清理 Chrome 就是这么干的...
    JCZ2MkKb5S8ZX9pq
        17
    JCZ2MkKb5S8ZX9pq  
       2020-05-24 21:08:38 +08:00 via iPhone
    各个位置分别打一下 os.getpid() 位置要找对
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2812 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:10 · PVG 15:10 · LAX 23:10 · JFK 02:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.