虚拟环境:不干扰地使用virtualenv #!/usr/bin/env python

3

我的应用程序是用Python 3编写的,并且我在虚拟环境中工作。在我的集群上,安装了HDP(Hortonworks),一些脚本需要Python 2支持。这些脚本在头部有#!/usr/bin/env python,但由于我的虚拟环境已激活,它链接到了我的Python 3安装。如何解决这个问题?由于明显的原因,我无法修改HDP源码。

1个回答

3

修改您的Virtualenv

如果您希望您的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

下面的内容将假设您正在寻找更加精细的方法。

针对特定命令的Shell包装器

如果您通过名为 hdp 的前端与Hortonworks进行交互,请考虑以下内容作为一个shell函数,这是一个hdp的包装器,可以停用virtualenv。
hdp() (
  if [[ $VIRTUAL_ENV ]]; then
    deactivate
  fi
  exec command hdp "$@"
)

因为此函数使用括号而不是花括号,它在子shell中运行——一个独立的shell环境副本——因此当它运行 deactivate 时,这不会影响您的父shell。这也意味着exec命令会导致子shell用hdp命令替换自己,而不是导致您的父shell终止。

通用Shell包装器

如果您想临时取消激活虚拟环境并运行其他脚本,请考虑使用以下方法:
# wv == "without virtualenv"
wv() (
  if [[ $VIRTUAL_ENV ]]; then
    deactivate
  fi
  exec "$@"
)

...这样wv foo会在virtualenv未激活的情况下运行foo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接