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

CIs*_*ies 3 python virtualenv

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

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

#!/home/bla/bla2/bla3/venv/bin/python
import virtualenv stuff...
Run Code Online (Sandbox Code Playgroud)

我假设

  1. 将预先安装 virtualenv
  2. 脚本 / dir / venv 将留在完全相同的地方

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

Hac*_*ck5 6

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

  • @CIsForCookies shell 脚本不需要假设任何东西 - 它可以在磁盘上定位自己,并使用专用的 venv 命令或简单的通配符来设置 venv。另一方面,如果您的磁盘坏了,并且您必须重新安装备份中的所有内容,会发生什么 - 您可能会更改您的用户名,或者只是将项目放在不同的文件夹中?这种情况下的损失超过了制作剧本的努力。 (2认同)

sin*_*roc 2

这完全没问题,这就是入口点的控制台脚本的生成方式。当然,存在文件和目录不能重命名等限制,但这很明显。

\n\n

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

\n\n
/tmp/tmp.cqz22j4Vg7$ cat .venv/bin/pip\n
Run Code Online (Sandbox Code Playgroud)\n\n
#!/tmp/tmp.cqz22j4Vg7/.venv/bin/python3\n\n# -*- coding: utf-8 -*-\nimport re\nimport sys\n\nfrom pip._internal.cli.main import main\n\nif __name__ == \'__main__\':\n    sys.argv[0] = re.sub(r\'(-script\\.pyw?|\\.exe)?$\', \'\', sys.argv[0])\n    sys.exit(main())\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

常见的做法是保留这样的虚拟环境,并添加指向 .txt 中列出的目录中的特定脚本的符号链接PATH。例如,可以在虚拟环境中安装tox并使其可以从任何地方使用:

\n\n
ln -s \'/path/to/venv/bin/tox\' "${HOME}/.local/bin/tox"\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自 Python 的venv文档:

\n\n
\n

其他情况不需要激活虚拟环境;安装到虚拟环境中的脚本有一个 \xe2\x80\x9cshebang\xe2\x80\x9d 行,它指向虚拟环境\xe2\x80\x99s Python 解释器。

\n
\n\n

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

\n