我的应用程序是用Python 3编写的,并且我在虚拟环境中工作。在我的集群上,安装了HDP(Hortonworks),一些脚本需要Python 2支持。这些脚本在头部有#!/usr/bin/env python,但由于我的虚拟环境已激活,它链接到了我的Python 3安装。如何解决这个问题?由于明显的原因,我无法修改HDP源码。
我的应用程序是用Python 3编写的,并且我在虚拟环境中工作。在我的集群上,安装了HDP(Hortonworks),一些脚本需要Python 2支持。这些脚本在头部有#!/usr/bin/env python,但由于我的虚拟环境已激活,它链接到了我的Python 3安装。如何解决这个问题?由于明显的原因,我无法修改HDP源码。
如果您希望您的virtualenv永远被忽略,使用#!/usr/bin/env python
shebang(但不是使用#!/usr/bin/env python3
shebang),则有一种大锤式的方法可以防止virtualenv添加到PATH
中的python
条目匹配,但不一定执行其他清理操作:
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 "$@"
)
deactivate
时,这不会影响您的父shell。这也意味着exec
命令会导致子shell用hdp
命令替换自己,而不是导致您的父shell终止。
# wv == "without virtualenv"
wv() (
if [[ $VIRTUAL_ENV ]]; then
deactivate
fi
exec "$@"
)
...这样wv foo
会在virtualenv未激活的情况下运行foo
。