Я думаю, что это прекрасно работает
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, мы даем вывод процесса 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 21093
- это идентификатор gnome-терминал, который является ppid для vim.
Теперь это произошло, если я не использовал 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:~$
Эти идентификаторы по какой-то причине не существуют.
Если существует несколько экземпляров vim: он производит:
['21416 21093 vim', '21736 21093 vim', '21738 21728 grep vim', '']
Чтобы получить последний pid экземпляра vim:
output = output[len(output) - 3]
Наш вывод сортируется в порядке возрастаниязначения pid, а также наше последнее и второе последнее значения
и grep vim
, поэтому нам нужен третий последний аргумент для получения pid для vim.
Прокомментируйте, если что-то можно улучшить.