我正在编写一个Python程序,该程序需要知道执行脚本的外壳程序的可执行位置。例如,我希望找到/usr/bin/env/{bash,zsh,fish}
或其他。我该怎么办?
不幸的是,由于我不知道从哪里开始,所以我无法给出一个简单,完整和可验证的示例。我无法在网上找到任何东西。
至少我已经研究了psutil
。我已经尝试获取父进程的PID,但是我只是获取了当前Python进程的PID。
答案 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