请教,python 执行外部程序,并且获取外部程序的 pid。目前操作获取到的都是 python 的 pid 以及 cmd 的 pid,获取不到运行了的外部程序的 pid。请教大佬
|
linxiaoziruoJul 26, 2019
1
我就纳闷儿了,我啥时候发的这个帖子
|
|
smallpythonJul 26, 2019
2
自问自答
太优秀了 |
|
edsion996Jul 26, 2019
3
不是通过 subprocess 创建的子进程吗,子进程的 pid 可以直接拿到啊。
但是,如果是子进程再创建的子进程,就不一定行了。研究一下进程组试试。 |
|
5
@linxiaoziruo 我也懵逼了 吓得我 看了再看看
|
|
SbloodySJul 26, 2019
6
执行一下 ps aux 就好了
|
|
estJul 26, 2019
7
仔细看文档了么?把文档里你调用的方法的文档复制过来看看 ctrl+f 一下 pid
|
|
www5070504Jul 26, 2019
8
如果 subprocess 拿不到的话 用 psutil 查询一遍所有进程的名字和试试用父进程 pid 呢
|
|
www5070504Jul 26, 2019
9
感觉直接用 psutil 查一遍是最省事的了。。
|
|
ysc3839Jul 26, 2019 via Android
10
贴代码看看?
|
|
SylvJul 26, 2019 via iPhone
11
哈哈,一楼我没反应过来,还以为楼主精分了。
|
|
chinazzJul 26, 2019
12
# 创建进程
p = subprocess.Popen(cmd_, shell=True, cwd=, stdin=, stdout=, stderr=) # 获得 pid pid = p.pid # 监听 glan = psutil.Process(pid) |
|
chinazzJul 26, 2019
13
subprocess 是可以拿到 pid 的
|
|
14
@chinazz 抱歉, 应该是我的表述有误。就是我想获取的 pid 是子进程运行后再创建的子进程。
#创建进程 p = subprocess.Popen('unins000.exe') #获取 exe 的 pid pid = p.pid 但是这个 exe 运行后,会有一个进程 pid。请问这个 pid 怎么获取。 |
|
j0hnjJul 26, 2019
15
你这个表达能力真的堪忧…
你想做的应该是子进程的子进程的 pid, 如果 unins000.exe 不是自己能控制的话,直接通过 subprocess 是拿不到它的子进程的 pid 的, 只能是用 psutil 遍历全部的 pid, 筛选出 parenet_pid == unins00.exe pid 的那些进程 |
|
ClericPyJul 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 |
|
douglas1997Jul 26, 2019
20
看到一楼笑出声。
|
|
ranleleSep 2, 2019
21
我今天也尝试了这个,当设置 shell=False 时,返回的 pid 为执行 shell 命令之后开启的进程的 pid。
|