如何在非 bash shell 中激活 python venv?

如何在非 bash shell 中激活 python venv?

我看到大多数教程/在线资源建议使用 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 中是否总是需要使用sourcevenv 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...),它不以任何方式特定。sourceshbash

还有一个bin/activate.cshforcshtcshshell,以及一个 bin/activate.fishfor the fishshell。

如果您使用任何其他 shell,则需要您自己,但这应该不会太难适应,因为这只是定义或更新VIRTUAL_ENV,PYTHONHOMEPATH环境变量的问题。

或者,您始终可以从源sh代码中重新执行 shell 。bin/activate例如,来自rcpython-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 版本的不同容器,请记住容器已经是某种形式的虚拟化。

相关内容