我看到大多数教程/在线资源建议使用 or source
(.
bash 内置)来激活 python venv。例如,这一页建议在 Linux 中执行以下操作:
cd ~/<proj_name>
. bin/activate
(而在 Windows 中,它只是cd\<proj_name>
和
activate
)
但我需要在 docker/Dockerfile 中激活 venv,并且 bash 可能不可用(例如使用 podman OCI 映像)。作为基础发行版,例如基于 Debian 的发行版那些采用公众号 668, 旧 Dockerfile 中没有 venv 的 pip 命令导致错误“此环境由外部管理”。现在建议的方法似乎是使用 venv。
source
考虑到特定于某些 shell 的事实,我的问题是:
在 Linux 中是否总是需要使用source
venv activate
?
如果是这样,为什么以及在一般非 bash shell 中激活 venv 的正确方法是什么?
特别是,在通用 Dockerfile 中的 pip 命令上使用 venv 的正确方法是什么?
答案1
bin/activate
可以由任何类似 Bourne 的 shell(该 shell或自 70 年代末以来的任何系统以及所有 ash、dash、busybox sh(ash 或 mush)、ksh .
、pdksh、mksh、oksh、bosh、yash、zsh...),它不以任何方式特定。source
sh
bash
还有一个bin/activate.csh
forcsh
或tcsh
shell,以及一个 bin/activate.fish
for the fish
shell。
如果您使用任何其他 shell,则需要您自己,但这应该不会太难适应,因为这只是定义或更新VIRTUAL_ENV
,PYTHONHOME
和PATH
环境变量的问题。
或者,您始终可以从源sh
代码中重新执行 shell 。bin/activate
例如,来自rc
python-venv 似乎不支持的 shell 或衍生物:
exec sh -c '. /path/to/bin/activate && exec rc'
rc
将使用更新的环境重新执行sh
。
无论如何,您的容器可能会有一个/bin/sh
类似于 Bourne 的容器,无论是 busybox、mksh 还是 bash。
要在使用该虚拟环境的容器中运行一些命令,与上面类似,您可以运行:
sh -c '. /path/to/venv/bin/active && exec "$0" "$@"' python3 /path/to/whatever.py
假设您出于某种原因需要在单个容器中拥有不同的虚拟环境。最有可能的是,您可以使用具有不同集合或 python 模块或 python 版本的不同容器,请记住容器已经是某种形式的虚拟化。