获取父路径 shell

Get the path of the parent shell

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

不幸的是,我无法给出一个最小的、完整的和可验证的例子,因为我不知道从哪里开始。我在网上找不到任何东西。

至少我调查过 psutil。我试图获取父进程的 PID,但我只是获取了当前 Python 进程的 PID。

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

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

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

让我解释一下代码:

  • Process(),没有参数,这会为 运行 进程创建一个 Process 对象,即 Python 解释器。
  • .parent() 得到父 Process(),那可能就是 shell.
  • .exe()获取父进程可执行文件的路径

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