Python venv模块(五)——venv进阶操作
本文介绍venv模块的一些进阶操作,包括修改命令提示符、覆盖已有环境、一次创建多个虚拟环境、更新核心依赖、不安装pip、引入系统包、明确选择创建Python可执行文件的副本或符号链接及将虚拟环境中的Python更新至系统版本
本文默认以Linux系统为例。
修改命令提示符(环境名)
如前面章节所言,虚拟环境名是可以任取的。常用的有:
venv
env
.venv
使用
venv
作为虚拟环境名是一个惯例,它有助于使用.gitignore
文件从版本控制中可靠地排除虚拟环境
使用自定义的环境名:
python3 -m venv your-fancy-name/
source your-fancy-name/bin/activate
如前面的章节所言,这会在当前路径下创建your-fancy-name
文件夹,其中包含了类似标准Python安装的结构,而且由于运行了激活脚本,命令行提示符最前面会显示自定义的虚拟环境名。
若想要使命令提示符前面显示的虚拟环境名与实际创建的虚拟环境文件夹名不同,则可用--prompt
参数指定:
$ python3 -m venv venv/ --prompt dev-env
$ source venv/bin/activate
(dev-env) $
覆盖已有环境
若创建一个环境后再次在相同位置创建同名环境,则新环境不会覆盖原来的环境。
例如:
$ python3 -m venv venv/
$ venv/bin/pip install requests
$ venv/bin/pip list
Package Version
------------------ ---------
certifi 2024.8.30
charset-normalizer 3.3.2
idna 3.8
pip 24.2
requests 2.32.3
urllib3 2.2.2
$ python3 -m venv venv/
$ venv/bin/pip list
Package Version
------------------ ---------
certifi 2024.8.30
charset-normalizer 3.3.2
idna 3.8
pip 24.2
requests 2.32.3
urllib3 2.2.2
在本例中,第一次创建的环境中安装的requests
包并未因为再次创建相同环境而被覆盖。(本例中,使用虚拟环境中pip
的绝对路径,而未激活虚拟环境,这与激活环境后再使用pip
是等效的。)
要覆盖原同名环境,则需添加--clear
参数:
$ python3 -m venv venv/
$ venv/bin/pip install requests
$ venv/bin/pip list
Package Version
------------------ ---------
certifi 2024.8.30
charset-normalizer 3.3.2
idna 3.8
pip 24.2
requests 2.32.3
urllib3 2.2.2
$ python3 -m venv venv/ --clear
$ venv/bin/pip list
Package Version
---------- -------
pip 24.2
一次创建多个虚拟环境
调用venv
模块时后面可跟多个路径,即可同时创建多个虚拟环境(后面跟的虚拟环境数没有直接限制):
$ python3 -m venv venv/ /home/name/virtualenvs/venv-copy/
实际上,
python3 -m venv
后面跟的路径是shell里面的常规路径,即可以是相对路径和绝对路径,可创建在任意有对应权限的位置。venv/
也算是一种相对路径,与./venv/
等价。
更新核心依赖
当新创建一个虚拟环境并使用pip
安装外部包时,可能会遇到一个警告信息:
WARNING: You are using pip version 23.2.4; however, version 24.2 is available.
You should consider upgrading via the
'/path/to/venv/python -m pip install --upgrade pip' command.
新建的环境的pip
包居然已经过时了。这是因为使用venv
创建虚拟环境时安装pip
的默认配置时使用ensurepip
来把pip
引入虚拟环境。
但ensurepip
并不联网,而是使用与每个新发布的CPython
绑定的pip
轮子,由此,绑定的pip
与独立的pip
项目的更新周期并不同。
而当使用pip
安装外部包时,程序会链接PyPI
并验证pip
本身是否过时,若过时,则显示上述警告。
可在遇到该警告时按提示更新,也可在创建虚拟环境时直接加上参数--upgrade-deps
:
$ python3 -m venv venv/ --upgrade-deps
$ source venv/bin/activate
(venv) $ python -m pip install --upgrade pip
Requirement already satisfied: pip in ./venv/lib/python3.12/site-packages (24.2)
使用该参数会在创建环境时自动连接PyPI
来更新最新pip
版本。
不安装pip
创建虚拟环境的主要时间和空间开销都在于pip
的安装。一般而言,我们创建虚拟环境后都会用到pip
来安装外部包。若出于一些原因,你不需要在虚拟环境中使用pip
,则可以使用--without-pip
参数:
$ python3 -m venv venv/ --without-pip
$ du -hs venv/
56K venv
这样虚拟环境还是能够提供带有独立Python可执行程序的轻量隔离环境。
不在虚拟环境中安装
pip
,可能仍能使用pip
命令,但这并不能在虚拟环境中安装外部包,而会把包安装在其他位置,而且无法在虚拟环境中使用。
不在虚拟环境中安装pip
,而又仍需安装外部包,可以手动把包安装在虚拟环境的site-packages
目录下,或把zip
文件放在哪里,并通过Python ZIP imports
引用。
引入系统包
如果你在系统中费时费力费空间地在全局Python环境中安装了一些外部包(如PyTorch或TensorFlow),你可能希望在虚拟环境中使用系统安装的外部包,而不是在虚拟环境中再装一遍。
可在创建虚拟环境时使用--system-site-packages
标志来实现这一点(它会把虚拟环境的pyvenv.cfg
文件中的include-system-site-packages
的值设为true
)。这会使你在虚拟环境中具有对系统安装包的只读权限,虚拟环境中安装的包依然在虚拟环境的文件夹下。
明确选择创建Python可执行文件的副本或符号链接
创建虚拟环境时,安装的Python可执行文件可能是副本也可能是副本:
- Windows 可以创建符号链接或副本,但某些版本不支持符号链接。创建符号链接可能需要管理员权限。
- Linux 发行版可以创建符号链接或副本,但通常选择符号链接而非副本。
- macOS 总是创建二进制文件的副本。
创建符号链接有助于和系统Python版本保持同步。如更新了系统Python版本,符号链接则同步指向新版本,而副本则仍为原版本。但在Windows下使用符号链接,双击链接时系统可能会优先解析符号链接而忽视虚拟环境。
可使用--symlinks
或--copies
标志明确选择时选用符号链接还是副本:
--symlinks
将尝试创建符号链接,而不是拷贝。该选项对 macOS 的构建没有任何影响。--copies
将尝试创建 Python 二进制文件的拷贝,而不是将它们链接到基本 Python 安装的可执行文件。
将虚拟环境中的Python更新至系统版本
若创建虚拟环境时选用的是Python的副本,而且之后更新了系统的Python版本,则可使用--upgrade
标志将虚拟环境中的Python可执行文件和pip
更新至系统相同版本,同时保持其他安装的包不变:
$ python3 -m venv venv/ --upgrade
参考资源
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)