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...
我认为
- virtualenv 将预先安装
- 脚本/目录/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
我有一个脚本,我必须为其启用特定的 virtualenv。
运行 如果在脚本运行时 virtualenv 没有打开,带有 #!/usr/bin/env python / python3 / python3.6
的脚本将不会剪切它,所以我做了这样的事情:
#!/home/bla/bla2/bla3/venv/bin/python
import virtualenv stuff...
我认为
- virtualenv 将预先安装
- 脚本/目录/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