python - 获取 Python 子进程中终端内执行的命令的进程 ID
问题描述
我在 Python 子进程的 gnome-terminal 中运行 vim:
>>> import subprocess
>>> cmd=['gnome-terminal', '--', 'vim']
>>> p = subprocess.Popen(cmd)
可以使用 获取 gnome-terminal 的进程 ID p.pid
,但是如何从 Python 脚本中获取 vim 的进程 ID?
即使pstree
在 Bash 中将 vim 显示为 gnome-terminal 的子进程,psutils 也不会列出它。
>>> import psutil
>>> terminal_process = psutil.Process(p.pid)
>>> terminal_process.children()
[]
解决方案
我认为这很好用
import time
import subprocess
cmd=['gnome-terminal','--', 'vim']
p = subprocess.Popen(cmd)
time.sleep(10)
a = subprocess.Popen(['ps', '-eo', 'pid,ppid,command'], stdout = subprocess.PIPE)
b = subprocess.Popen(['grep', 'vim'], stdin = a.stdout, stdout = subprocess.PIPE)
output, error = b.communicate()
output = output.decode("utf-8").split('\n')
print(output)
我使用的原因time.sleep(10)
是由于某种原因vim
没有那么快地分叉,所以我将它延迟了 10 秒。
这里我们创建了 2 个进程来获取 vim 编辑器的 ID,我们将进程的输出提供a
给b
使用 stdout 和 stdin。
然后我们使用.communicate()
将进程的标准输出b
转换为output
.
现在我们output
是字节形式的,所以我们使用 UTF-8 解码它.decode("utf-8")
,然后在每个新行上拆分。
它产生输出:
rahul@RNA-HP:~$ python3 so.py
# _g_io_module_get_default: Found default implementation gvfs (GDaemonVfs) for ‘gio-vfs’
# _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’
# watch_fast: "/org/gnome/terminal/legacy/" (establishing: 0, active: 0)
# unwatch_fast: "/org/gnome/terminal/legacy/" (active: 0, establishing: 1)
# watch_established: "/org/gnome/terminal/legacy/" (establishing: 0)
['21325 21093 vim', '21330 21318 grep vim', '']
rahul@RNA-HP:~$
要验证这一点:
rahul@RNA-HP:~$ ps aux | grep gnome-terminal
rahul 21093 1.7 2.4 978172 45096 ? Ssl 19:55 0:02 /usr/lib/gnome-terminal/gnome-terminal-server
rahul 21374 0.0 0.0 8988 840 pts/0 S+ 19:57 0:00 grep --color=auto gnome-terminal
rahul@RNA-HP:~$ ps -eo pid,ppid,command | grep vim
21325 21093 vim
21376 21104 grep --color=auto vim
rahul@RNA-HP:~$
在这里我们可以看到 vim 是从 gnome-terminal 派生出来的,它是 gnome-terminal21093
的 id,也就是 vim 的 ppid。
现在,如果我不使用就会发生这种情况time.sleep(10)
rahul@RNA-HP:~$ python3 so.py
['21407 21406 /usr/bin/python3 /usr/bin/gnome-terminal -- vim', '21409 21406 grep vim', '']
如果我们尝试验证这些 PID 是否存在:
rahul@RNA-HP:~$ kill 21407
bash: kill: (21407) - No such process
rahul@RNA-HP:~$
由于某种原因,这些 ID 不存在。
如果有多个 vim 实例:它会产生:
['21416 21093 vim', '21736 21093 vim', '21738 21728 grep vim', '']
要获取最新的实例化 vim 的 pid:
output = output[len(output) - 3]
我们的输出按 pid 的升序排序,最后一个和倒数第二个值是,
grep vim
所以我们需要倒数第三个参数来获取 vim 的 pid。
评论是否可以改进。
推荐阅读
- ffmpeg - Ffmpeg [NULL @ 0x56390335ae80] 无法找到适合“听”听的输出格式:无效参数
- image - Flutter Image Picker 仅在模拟器中工作
- c++ - 如何让代码检测 C++ 17 中是否存在文件?
- java - Java 和 Android Studio 监听器语法
- c - 如何在 C (LINUX) 中使用 makefile 执行某个部分
- c# - 扩展属性中的 Odata 过滤不起作用
- azure - 如何授予 Azure CLI 图形 API 权限
- python - 用python强制函数args类型
- tableau-api - 设置增量刷新时可以刷新多个表吗?
- fonts - 如何将 otf 字体链接在一起以便它们可以一起使用?