获取父外壳的路径

时间:2019-03-31 12:14:49

标签: python python-3.x process parent pid

我正在编写一个Python程序,该程序需要知道执行脚本的外壳程序的可执行位置。例如,我希望找到/usr/bin/env/{bash,zsh,fish}或其他。我该怎么办?

不幸的是,由于我不知道从哪里开始,所以我无法给出一个简单,完整和可验证的示例。我无法在网上找到任何东西。

至少我已经研究了psutil。我已经尝试获取父进程的PID,但是我只是获取了当前Python进程的PID。

2 个答案:

答案 0 :(得分:1)

使用psutil应该或多或少简单:

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

让我解释一下代码:

  • Process(),不带参数,这会为正在运行的进程创建一个Process对象,即Python解释器。
  • .parent()获得父项Process(),可能是外壳程序。
  • .exe()获取父进程的可执行文件的路径。

根据您的设置,您可能需要一些其他路径,但这对于最简单的情况就足够了。

答案 1 :(得分:0)

您可以使用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

然后您可以解析该输出以提取shell 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