为什么Python Popen使用不同的可执行文件

时间:2014-03-07 17:30:21

标签: python path subprocess popen

我在这台电脑上有两个不同版本的程序。我无法摆脱旧版本,因为我没有root访问权限,但是我把新版本放在我的主目录中的'bin'中(这是我的$ PATH中的第一件事)

我尝试用Python的Popen

调用它
Popen(['clingo'...]...)

它工作正常

但是之后我需要在调用它之前设置一个环境变量,所以我在bin目录中将'clingo'重命名为'run_clingo'并用脚本替换它:

# File: ~/bin/clingo
export LD_LIBRARY_PATH=/usr/local/gcc4.8.1/lib64:$LD_LIBRARY_PATH
run_clingo $@

当我从终端运行'clingo'时,它工作正常,但Python Popen调用旧版本(稍后在PATH上)。

如何让Popen拨打正确的电话?为什么将可执行文件更改为脚本会导致Popen在别处搜索?

2 个答案:

答案 0 :(得分:2)

#!/bin/sh的最顶部添加shebang ~/bin/clingo并运行:

$ chmod +x ~/bin/clingo

使文件可执行。

Popen()调用os.execvp()来执行程序。 Its behaviour differs from your shell that emulates execvp():如果脚本中没有shebang(!#..),那么shell会将其作为shell脚本重新运行,但Python的os.execvp()会在PATH中运行下一个文件。< / p>

答案 1 :(得分:1)

狂野的猜测是,Popen不会使用与终端相同的PATH。我会检查shebang行(#!),有时人们将env -i python放在那里,明确要求空,即默认环境。

请注意,建议使用subprocess.call,而不是直接使用Popen