我正在编写一个Python程序,需要知道执行脚本的shell的可执行位置。例如,我希望找到/usr/bin/env/{bash,zsh,fish}
或其他。我该怎么做?
不幸的是,我不能给出一个最小的,完整的,可验证的例子,因为我不知道从哪里开始。我无法在网上找到任何东西。
我至少看过psutil
。我试图获取父进程的PID,但我刚刚得到了当前Python进程的PID。
使用psutil
应该或多或少直截了当:
import psutil
print(psutil.Process().parent().exe())
让我解释一下代码:
Process()
,没有参数,这为正在运行的进程创建了一个Process
对象,即Python解释器。.parent()
得到了父亲Process()
,这可能是贝壳。.exe()
获取父进程可执行文件的路径。根据您的设置,您可能需要一些额外的路径,但对于最简单的情况,这应该足够了。
您可以使用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