virtualenv没有干扰#!/ usr / bin / env python

时间:2016-07-20 10:11:19

标签: python virtualenv shebang

我的应用程序是在python 3中编写的,我在virtualenv中工作。在我的集群上,安装了hdp(hortonworks),一些脚本需要python 2.这些脚本在标题中有#!/ usr / bin / env python,但它链接到我的python 3安装,因为我的virtualenv被激活了。怎么解决这个?由于显而易见的原因,我无法修改hdp源。

1 个答案:

答案 0 :(得分:3)

修改您的Virtualenv

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

以下内容将假设您正在寻找更多精致的方法。

特定于命令的Shell Wrapper

如果您通过名为hdp的前端与Hortonworks进行交互,请考虑以下shell函数,hdp的包装器,用于停用virtualenv:

hdp() (
  if [[ $VIRTUAL_ENV ]]; then
    deactivate
  fi
  exec command hdp "$@"
)

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

Generic Shell Wrapper

如果您希望能够在暂时停用virtualenv的情况下运行其他脚本,请考虑改为:

# wv == "without virtualenv"
wv() (
  if [[ $VIRTUAL_ENV ]]; then
    deactivate
  fi
  exec "$@"
)

...这样wv foo将在已停用virtualenv的情况下运行foo