python自带工具 venv 简明教程
在Python中,代码可能依赖特定版本的包,如果代码a和代码b依赖包c的不同版本,这个时候就会导致 a 和 b 无法共存,也就是 a 和 b 存在冲突。
用 venv 解决办法就是,创建 2 个不同的虚拟环境来分别存放 a 和 b,这样就可以解决问题了。
以这个问题为例,简单说明如何使用 venv,需要特别说明的是:venv不能解决不同版本python的依赖问题,即 venv 只能解决同一 python 版本下不同版本的包的依赖问题。
原因也好理解,venv 是python自带的嘛。
不同版本的python看作上层,每一个版本的python下又有该版本可正常运行的软件,这个可以看作下层。venv解决的就是每一个版本下的软件树冲突的问题。这也是最常见的方式,因为现在软件都是增量更新,新版本都是在旧版本上增加新的功能,而不会改变以前有的功能。
在debian系的系统中,由于系统用 python3-xyz 的方式安装了一些包,这些包被系统下的某些软件依赖。当我们再用 pip 安装包与系统安装的包产生冲突时,有可能会使依赖包失效。
为了解决这个问题,可用 venv 产生一个虚拟环境,pip在虚拟环境运行,这样避免和系统环境的包冲突。
1、安装 venv
sudo apt install python3-venv
2、创建虚拟环境
存放软件a
python3 -m venv a_env
存放软件 b
python3 -m venv b_env
3、启用虚拟环境
启动 a 环境
source ./a_env/bin/activate
安装 a 软件
pip install a
同样的方法启动 b 环境
这样就可以分别对 a 和 b 安装不同版本的依赖包 c 了。
4、退出环境
deactivate
5、查看有几个 venv 环境
没有这个命令,venv简单说就是一个python文件,这也是为啥不能管理不同的 python 版本。但可以通过把所有的环境放到同一个目录里面,这样通过 ls 就可以看到有几个不同环境了。
6、venv的帮助文件命令
通过 python3 -m venv --help 来查看简单的命令说明。
官方的详细解释:venv --- 创建虚拟环境 — Python 3.12.0 文档
关于python的PEP文档:PEP 405 – Python Virtual Environments | peps.python.org
7、几个常用参数的说明
这些参数用于自定义和控制python3 -m venv
命令创建的Python虚拟环境的行为。下面是对每个参数的解释以及使用示例:
-
--system-site-packages
- 解释: 此选项允许虚拟环境访问系统的site-packages目录,这意味着虚拟环境中不仅包含独立的库,还可以使用系统级别的Python库。这对于那些希望在隔离环境中同时使用一些全局安装的库的情况很有用。
- 示例:
python3 -m venv --system-site-packages myenv
创建名为myenv
的虚拟环境,并使其能够访问系统全局的site-packages。
-
--symlinks
- 解释: 当平台默认不使用符号链接时,尝试使用符号链接代替复制文件来创建虚拟环境。这可以节省磁盘空间,但可能在某些文件系统或平台上不总是可行。
- 示例:
python3 -m venv --symlinks myenv
在支持的情况下,尝试使用符号链接创建myenv
虚拟环境中的文件结构。
-
--copies
- 解释: 即使在平台上默认使用符号链接,也强制使用复制而非符号链接来创建虚拟环境的文件。这保证了环境的完全独立性,但可能会占用更多存储空间。
- 示例:
python3 -m venv --copies myenv
强制在创建myenv
虚拟环境时使用文件复制。
-
--clear
- 解释: 如果虚拟环境目录已经存在,该选项会先清空其内容然后再创建新的虚拟环境。这用于重置或更新一个现有的虚拟环境。
- 示例:
python3 -m venv --clear myenv
如果myenv
已存在,会先清除其内部所有内容,然后重新创建虚拟环境。
-
--upgrade
- 解释: 如果Python已经被原地升级(在同一路径下更新了版本),此选项会更新虚拟环境以使用新版本的Python。适用于Python升级后需要同步更新虚拟环境的情况。
- 示例:
python3 -m venv --upgrade myenv
如果Python版本已变更,更新myenv
虚拟环境以匹配当前Python版本。
-
--without-pip
- 解释: 创建虚拟环境时不安装或升级pip。这适用于希望保持环境极其精简或手动控制pip安装的情况。
- 示例:
python3 -m venv --without-pip minimalenv
创建一个不包含pip的虚拟环境minimalenv
。
-
--prompt PROMPT
- 解释: 自定义虚拟环境激活时的命令行提示前缀。
PROMPT
是你想要设置的自定义前缀。 - 示例:
python3 -m venv --prompt=(myproj) projectenv
创建名为projectenv
的虚拟环境,激活时提示前缀为(myproj)
。
- 解释: 自定义虚拟环境激活时的命令行提示前缀。
-
--upgrade-deps
- 解释: 升级虚拟环境中的核心依赖(主要是pip)到PyPI上的最新版本。这确保了虚拟环境使用的工具是最新状态。
- 示例:
python3 -m venv --upgrade-deps freshenv
创建并确保freshenv
虚拟环境中的pip等核心库为最新版本。
通过组合使用这些选项,你可以灵活地定制虚拟环境的创建过程,以满足不同的开发需求。