Получить путь родительской оболочки - PullRequest
1 голос
/ 31 марта 2019

Я пишу программу на Python, которая должна знать расположение исполняемой оболочки, из которой был выполнен скрипт.Например, я ожидал бы найти /usr/bin/env/{bash,zsh,fish} или иначе.Как мне это сделать?

К сожалению, я не могу привести минимальный, полный и поддающийся проверке пример, потому что я не знаю, с чего начать.Я не смог ничего найти в Интернете.

Я посмотрел, по крайней мере, psutil.Я попытался получить PID родительского процесса, но вместо этого я получил PID текущего процесса Python.

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Использование psutil должно быть более или менее простым:

import psutil
print(psutil.Process().parent().exe())

Позвольте мне объяснить код:

  • Process(), без аргументов это создает объект Process для запущенного процесса, то есть интерпретатор Python.
  • .parent() получает родительский элемент Process(), который, вероятно, является оболочкой.
  • .exe() получает путь к исполняемому файлу родительского процесса.

В зависимости от настроек может потребоваться дополнительный путь, но этого будет достаточно для простейших случаев.

0 голосов
/ 31 марта 2019

Вы можете использовать модуль subprocess, чтобы получить вывод команды ps:

import subprocess, re

psoutput = subprocess.check_output(['ps','-o','pid,cmd'])

, которая в моем случае выдает:

  PID CMD
 9650 bash
10290 python app.py
10291 ps -o pid,cmd

Затем вы можете разобрать, чтовывод для извлечения PID оболочки:

pid = re.findall('\s*(\d+)\s*(bash|zsh|fish)',psoutput)[0][0]

, который выводит 9650 в моем случае.

Из PID вы можете извлечь путь следующим образом (в моем случае PID = 9650):

path = subprocess.check_output(['readlink','-f','/proc/'+pid+'/exe'])

который выводит в моем случае:

/bin/bash
...