获取父 shell 的路径

Get the path of the parent shell

提问人:Jacob Birkett 提问时间:3/31/2019 最后编辑:Jacob Birkett 更新时间:4/3/2019 访问量:1132

问:

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

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

至少我已经调查过了。我试图获取父进程的 PID,但我刚刚获得了当前 Python 进程的 PID。psutil

python-3.x 过程 父母 PID公司

评论

0赞 Vlad 3/31/2019
import os; os.getcwd()?
0赞 Jacob Birkett 3/31/2019
@Vlad 甚至没有接近。为什么我需要当前的工作目录?
0赞 Vlad 3/31/2019
是的,对不起。我误解了你的问题。
2赞 chepner 3/31/2019
@Shiva 否,是指默认 shell,它可能是也可能不是启动脚本的 shell。SHELL
1赞 chepner 4/1/2019
@spikespaz 如果你知道自己在做什么,恭喜你。许多发布此类问题的人不会这样做,这就是为什么当有人试图做一些不寻常的事情时,我们会问为什么首先存在“XY问题”一词。

答:

0赞 glhr 3/31/2019 #1

您可以使用该模块获取命令的输出:subprocessps

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
4赞 rodrigo 3/31/2019 #2

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

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

让我解释一下代码:

  • Process(),如果没有参数,这将为正在运行的进程创建一个对象,即 Python 解释器。Process
  • .parent()获取父级,那大概就是shell。Process()
  • .exe()获取父进程的可执行文件的路径。

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

评论

0赞 Jacob Birkett 4/1/2019
我接受这个答案不是因为其他答案不起作用,而是因为分步解释。虽然我没有必要理解它,但这个解释可能会帮助将来遇到这个问题的任何人。它也是交叉的,而使用命令的解决方案则不是。ps