我的应用程序是在python 3中编写的,我在virtualenv中工作。在我的集群上,安装了hdp(hortonworks),一些脚本需要python 2.这些脚本在标题中有#!/ usr / bin / env python,但它链接到我的python 3安装,因为我的virtualenv被激活了。怎么解决这个?由于显而易见的原因,我无法修改hdp源。
答案 0 :(得分:3)
如果你希望你的virtualenv 永远被#!/usr/bin/env python
shebang(但不是#!/usr/bin/env python3
shebang)忽略,那么就有一个大锤方法阻止virtualenv添加的python
中的PATH
条目匹配,但不一定要执行其他清理:
rm "$VIRTUAL_ENV/bin/python"
...或更好的替代方案(假设您的PATH中有python2.7
,并且它是您想要使用的内容):
cat >"$VIRTUAL_ENV/bin/python" <<'EOF'
#!/usr/bin/env bash
path_prefix=$VIRTUAL_ENV/bin:
if [[ $PATH = $path_prefix* ]]; then
PATH=${PATH#$path_prefix}
fi
unset PYTHONHOME VIRTUAL_ENV
exec python2.7 "$@"
EOF
以下内容将假设您正在寻找更多精致的方法。
如果您通过名为hdp
的前端与Hortonworks进行交互,请考虑以下shell函数,hdp
的包装器,用于停用virtualenv:
hdp() (
if [[ $VIRTUAL_ENV ]]; then
deactivate
fi
exec command hdp "$@"
)
因为此函数使用括号而不是花括号,所以它在子shell中运行 - shell环境的单独副本 - 因此当它运行deactivate
时,这不会影响您的父shell 。这也意味着exec
命令使子shell用hdp
命令替换本身,而不是导致父shell终止。
如果您希望能够在暂时停用virtualenv的情况下运行其他脚本,请考虑改为:
# wv == "without virtualenv"
wv() (
if [[ $VIRTUAL_ENV ]]; then
deactivate
fi
exec "$@"
)
...这样wv foo
将在已停用virtualenv的情况下运行foo
。