【问题标题】:Shebang directing to specific virtualenv - is it a good idea?Shebang 指向特定的 virtualenv - 这是个好主意吗?
【发布时间】:2020-06-09 15:27:19
【问题描述】:

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

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

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

我认为

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

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

【问题讨论】:

  • 不假设会更好?如果脚本只适合您,那很好;发表评论以更改路径。否则....检查是否安装了env,如果没有安装,依此类推...
  • 老实说,这很丑。但是如果你真的不能有一个包装 bash 脚本,并且真的可以保证这两个条件,那应该没问题。
  • 这将是一个“在我的机器上工作!”解决方案。
  • 不确定丑陋和“在我的机器上工作”的解决方案是一件坏事,因为这正是我想要的。 [耸肩:-)]。

标签: python virtualenv


【解决方案1】:

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

【讨论】:

  • 我同意我的解决方案不是通用的,但除此之外(正如我在假设中所说),这是否存在固有缺陷?它不会开源,也不会被其他机器/用户使用。我的意思是,为什么要使用包装器?它还假设有关 virtualenv 的东西(例如路径...),那么它如何更好?
  • @CIsForCookies shell 脚本不需要假设任何东西——它可以在磁盘上定位自己,并使用专用的 venv 命令或简单的通配符来设置 venv。另一方面,如果你的磁盘死了,你必须从备份中重新安装所有东西——你可能会更改你的用户名,或者只是将项目放在不同的文件夹中,会发生什么?这种情况下的损失超过了编写脚本的努力。
【解决方案2】:

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

例如这里是新创建的虚拟环境中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 是一个绝对路径,因此无需激活虚拟环境即可调用它们。

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

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

来自 Python 的 venv 文档:

在其他情况下应该不需要激活虚拟环境;安装到虚拟环境中的脚本有一个“shebang”行,它指向虚拟环境的 Python 解释器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多