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

2020-05-24 19:06:22 +08:00
 reaCodes
用 Subprocess.Popen 只能获得其中一个进程的 PID
2356 次点击
所在节点    程序员
17 条回复
ipwx
2020-05-24 19:09:10 +08:00
proc = subprocess.Popen(...)
proc.pid

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

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

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

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

https://psutil.readthedocs.io/en/latest/#psutil.Process.children
reaCodes
2020-05-24 19:26:10 +08:00
@AX5N 我找到的父进程竟然是 python.exe
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
2020-05-24 19:39:16 +08:00
@AX5N 请问 subprocess 有没有办法在新窗口启动程序,命令行程序,不然每次启动程序都是在当前窗口启动
AX5N
2020-05-24 19:44:00 +08:00
@reaCodes `subprocess.Popen("cmd.exe", creationflags = subprocess.CREATE_NEW_CONSOLE)`
reaCodes
2020-05-24 19:50:49 +08:00
@AX5N 哇有效,感谢,解决了我一个很大的问题
ClericPy
2020-05-24 20:43:33 +08:00
用 psutil 迭代出来挨个排除吧... 我清理 Chrome 就是这么干的...
JCZ2MkKb5S8ZX9pq
2020-05-24 21:08:38 +08:00
各个位置分别打一下 os.getpid() 位置要找对

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674978

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX