我需要更改 Python 应用程序调用的程序。很遗憾我无法更改 Python 代码。我只能改变调用环境(特别是,PATH
)。但不幸的是Python的子进程模块似乎忽略了PATH
(至少在某些情况下)。
我怎样才能强迫Python尊重PATH
当搜索要调用哪个二进制文件时?
为了说明这个问题,这里有一个 MVCE。实际的Python应用程序正在使用subprocess.check_output(['nvidia-smi', '-L'])
,但以下简化代码显示了相同的行为。
Create test.py
:
import os
from subprocess import run
run(['which', 'whoami'])
run(['/usr/bin/env', 'whoami'])
run(['whoami'])
os.execvp('whoami', ['whoami'])
现在创建一个本地whoami
编写脚本并执行test.py
:
echo 'echo foobar' >whoami
chmod +x whoami
PATH=.:$PATH python3 test.py
On my system1 this prints:
./whoami
foobar
konrad
konrad
I expect此代码始终打印foobar
代替konrad
.
我的 MVCE 包括os.execvp
打电话因为the subprocess文档 https://docs.python.org/3/library/subprocess.html#subprocess.Popen指出
在 POSIX 上,该类使用os.execvp()
-类似的行为来执行子程序。
不用说,actual execvp
POSIX API,从 C 调用,does尊重PATH
,所以这是一个 Python 特定问题。
1 Ubuntu 18.04.2 LTS, Python 3.6.9.