我在这台电脑上有两个不同版本的程序。我无法摆脱旧版本,因为我没有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在别处搜索?
答案 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
。