python - virtualenv 不干扰 #!/usr/bin/env python

标签 python virtualenv shebang

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

最佳答案

修改你的 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 函数,它是用于停用 virtualenv 的 hdp 的包装器:

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

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


通用外壳包装器

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

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

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

关于python - virtualenv 不干扰 #!/usr/bin/env python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38478374/

相关文章:

python - Kivy右键菜单

Python 的 virtualenv 和目录

python - shebang 不适用于 python 脚本

python - 使用外键创建多个对象

python - Tkinter <<ListboxSelect>> 不调用绑定(bind)函数

制作一个可以接受可迭代或任意数量参数的函数的 Pythonic 方法?

python - 激活virtualenv时如何不显示路径

python - 在ubuntu中升级python

java - Ubuntu 中的 Shebang 行解析问题

python - argparse(和已弃用的 optparse)如何在 bash 中响应 python 程序名称后的 'tab' 按键?