本文默认以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

参考资源

Python Virtual Environments: A Primer – Real Python

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐