是否可以为 python 创建嵌套虚拟环境?

2023-11-25

在处理一些自动化脚本时,我发现需要有一些可用于所有脚本的通用包(例如ipython and spyder)并仅安装每个脚本的差异包(我们称之为差异包)。有没有办法在Python中嵌套虚拟环境?也就是说,通过某种方式设置环境,以便 python 首先查看最内部的环境;如果没有找到,它会查找第二个最里面的环境,依此类推,直到到达系统范围的包环境?

我能找到的最接近的是使用venv模块与--系统站点包选项,但我无法实现我想要的:首先,我不想使用 root 权限在系统上安装软件包;其次,我找不到使用此选项嵌套虚拟环境的方法。

如果有的话,实现这种嵌套虚拟环境结构的最佳方法是什么?


您可以添加一个.pth文件(一个site模块功能)到派生虚拟环境的站点包目录,其中一行指向基本虚拟环境的站点包路径。

在 shell 中,你可以这样做:

# Assumes that the base virtual environment exists, activate it.
. base/bin/activate

# Create the derived virtual environment.
python -m venv ./derived

# Make the derived virtual environment import base's packages too.
base_site_packages="$(python -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')"
derived_site_packages="$(./derived/bin/python -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')"
echo "$base_site_packages" > "$derived_site_packages"/_base_packages.pth

base_site_packages is usually base/lib/python<VERSION>/site-packages, the code to get it is taken from https://stackoverflow.com/a/46071447/3063 – same for derived_site_packages.

基本环境中安装的软件包将在派生环境中可用。您可以通过执行以下操作来验证这一点pip list在派生环境中。

# Deactivating the base environment is optional,
# meaning that the derived environment can be activated directly too.
deactivate

. ./derived/bin/activate
pip list
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以为 python 创建嵌套虚拟环境? 的相关文章