Shebang 指向特定的 virtualenv - 这是个好主意吗?

Shebang directing to specific virtualenv - is it a good idea?

我有一个脚本,我必须为其启用特定的 virtualenv。

运行 如果在脚本运行时 virtualenv 没有打开,带有 #!/usr/bin/env python / python3 / python3.6 的脚本将不会剪切它,所以我做了这样的事情:

#!/home/bla/bla2/bla3/venv/bin/python
import virtualenv stuff...

我认为

  1. virtualenv 将预先安装
  2. 脚本/目录/venv 将保留在完全相同的位置

鉴于这 2 个假设,这是个好主意吗?如果没有,什么会更好?我不愿意有一个包装器 bash 脚本来打开 venv 然后调用我的脚本

您应该创建一个脚本来构建 venv,然后在其中运行该脚本。对 venv 的路径进行硬编码 python 是一个糟糕的主意,因为如果您更改用户名、PC 等或将代码提供给其他人(或使其开源),它将失败。

这很好,这就是入口点控制台脚本的生成方式。当然还有不能重命名文件和目录等限制,但这是很明显的。

例如,这里是新创建的虚拟环境中 pip 脚本的内容:

/tmp/tmp.cqz22j4Vg7$ cat .venv/bin/pip
#!/tmp/tmp.cqz22j4Vg7/.venv/bin/python3

# -*- coding: utf-8 -*-
import re
import sys

from pip._internal.cli.main import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

我相信脚本中的 shebang 是绝对路径,因此无需激活虚拟环境即可调用它们。

一种常见的做法是保留这样一个虚拟环境,并将符号 link 添加到 PATH 中列出的目录中的特定脚本。例如,可以在虚拟环境中安装 tox 并使其在任何地方都可用:

ln -s '/path/to/venv/bin/tox' "${HOME}/.local/bin/tox"

来自 Python 的 venv 文档:

There should be no need in other circumstances to activate a virtual environment; scripts installed into virtual environments have a “shebang” line which points to the virtual environment’s Python interpreter.

-- https://docs.python.org/3/library/venv.html?highlight=shebang