I think this works fine
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)
The reason I used time.sleep(10) is because for some reason vim was not getting forked that fast so, I delayed it for 10 seconds.
Here we create 2 process for getting the ID of vim editor, we give the output of process a to b using stdout and stdin.
Then we use .communicate() to get stdout of process b into output.
Now our output is in form of bytes so we decode it to UTF-8 using .decode("utf-8") and then split on every new line.
It produces the output:
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:~$
To verify this:
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:~$
Here we can see that vim is forked from gnome-terminal 21093 is the id of gnome-terminal which is the ppid of vim.
Now, this happened if I didn't use time.sleep(10)
rahul@RNA-HP:~$ python3 so.py ['21407 21406 /usr/bin/python3 /usr/bin/gnome-terminal -- vim', '21409 21406 grep vim', '']
If we try to verify if those PID exist:
rahul@RNA-HP:~$ kill 21407 bash: kill: (21407) - No such process rahul@RNA-HP:~$
Those ID dont exist for some reason.
If there are multiple instances of vim: It produces:
['21416 21093 vim', '21736 21093 vim', '21738 21728 grep vim', '']
To get the latest instantiated vim's pid:
output = output[len(output) - 3]
Our output is sorted in ascending order of pid's and our last and second last values are and grep vim so we need the third last argument for getting the pid of vim.
Comment if something can be improved.