virtualenv 是目前最流行的 python 虚拟环境配置工具。它不仅同时支持 python2 和 python3,而且可以为每个虚拟环境指定 python 解释器,并可以选择继承基础版本的包。
virtualenv 可以说是 venv 的增强版本,不过早在 venv 出现之前,virtualenv 就算是最受欢迎的命令行环境管理工具了。venv 的许多特性也是借鉴的 virtualenv,相比于 venv,其强大之处主要在:
更快
扩展性更强
自动发现并可创建多版本的
Python环境可通过
pip更新丰富的编程接口
安装
virtualenv使用
pip安装virtualenvpip3 install virtualenv常见虚拟环境管理操作
创建虚拟环境目录
[root@host-192-168-71-25 ~]# cd /data [root@host-192-168-71-25 data]# virtualenv projectenv3 created virtual environment CPython3.9.18.final.0-64 in 554ms creator CPython3Posix(dest=/data/projectenv3, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv) added seed packages: pip==25.1.1, setuptools==80.9.0 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator 它会在当前路径下,创建
projectenv3的目录,虚拟环境的所有命令和包都在这个目录下。[root@host-192-168-71-25 data]# cd projectenv3/ [root@host-192-168-71-25 projectenv3]# ll total 12 drwxr-xr-x 2 root root 4096 Aug 10 19:12 bin -rw-r--r-- 1 root root 194 Aug 10 19:12 CACHEDIR.TAG drwxr-xr-x 3 root root 23 Aug 10 19:12 lib drwxr-xr-x 3 root root 23 Aug 10 19:12 lib64 -rw-r--r-- 1 root root 209 Aug 10 19:12 pyvenv.cfg [root@host-192-168-71-25 projectenv3]#bin:存放一些python、pip命令的目录virtualenv的软件包管理目录site-package在lib/python3.6/site-packages/下。[root@host-192-168-71-25 projectenv3]# ls bin/ activate activate.fish activate.ps1 pip pip-3.9 python python3.9 activate.csh activate.nu activate_this.py pip3 pip3.9 python3 [root@host-192-168-71-25 projectenv3]# ls lib/python3.9/site-packages/ _distutils_hack pip-25.1.1.dist-info setuptools _virtualenv.pth distutils-precedence.pth pip-25.1.1.virtualenv setuptools-80.9.0.dist-info _virtualenv.py pip pkg_resources setuptools-80.9.0.virtualenv 激活虚拟环境
[root@host-192-168-71-25 projectenv3]# source bin/activate (projectenv3) [root@host-192-168-71-25 projectenv3]# python -V Python 3.9.18推出虚拟环境
(projectenv3) [root@host-192-168-71-25 projectenv3]# deactivate删除虚拟环境,只需要将这个虚拟环境目录删除即可。
[root@host-192-168-71-25 data]# pwd /data [root@host-192-168-71-25 data]# rm -rf projectenv3指定python解释器:
创建的虚拟环境的
python解释器,默认使用virtualenv里的版本。如果你是把
virtualenv安装在python2里,那默认的就是python2,安装在python3里,默认的就是python3。当然,你也可以自己指定使用哪个解释器版本,比如:virtualenv -p python3.12 projenv4运行之后
[root@host-192-168-71-25 data]# virtualenv -p python3.12 projenv4 created virtual environment CPython3.12.9.final.0-64 in 376ms creator CPython3Posix(dest=/data/projenv4, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv) added seed packages: pip==25.1.1 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator [root@host-192-168-71-25 data]# cd projenv4/ [root@host-192-168-71-25 projenv4]# ls bin CACHEDIR.TAG lib lib64 pyvenv.cfg [root@host-192-168-71-25 projenv4]# source ./bin/activate (projenv4) [root@host-192-168-71-25 projenv4]# python -V Python 3.12.9继承基础环境的包
virtualenv从版本20开始,默认就是'--no-site-packages'了,默认就是不继承父环境的包。创建的虚拟环境是一个不带任何第三方包的“干净”的Python运行环境。如果有教程告诉你,“
--no-site-packages选择不继承父环境的包”,这个命令已经废弃了。那么,如果你现在想要继承父环境的包,怎么办?使用
--system-site-packages[root@host-192-168-71-25 ~]# pip3 install jieba [root@host-192-168-71-25 data]# virtualenv --system-site-packages projenv7 created virtual environment CPython3.9.18.final.0-64 in 238ms creator CPython3Posix(dest=/data/projenv7, clear=False, no_vcs_ignore=False, global=True) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv) added seed packages: pip==25.1.1, setuptools==80.9.0 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator进入虚拟目录 , 查看
python版本:[root@host-192-168-71-25 data]# cd projenv7 [root@host-192-168-71-25 projenv7]# . bin/activate (projenv7) [root@host-192-168-71-25 projenv7]# python -V Python 3.9.18 (projenv7) [root@host-192-168-71-25 projenv7]# ll /usr/local/lib/python3.9/site-packages/ total 16 drwxr-xr-x 3 root root 60 Aug 7 19:20 async_timeout drwxr-xr-x 2 root root 118 Aug 7 19:20 async_timeout-5.0.1.dist-info drwxr-xr-x 3 root root 4096 Aug 7 19:21 distlib drwxr-xr-x 2 root root 106 Aug 7 19:21 distlib-0.4.0.dist-info drwxr-xr-x 3 root root 4096 Aug 7 19:21 filelock drwxr-xr-x 3 root root 82 Aug 7 19:21 filelock-3.18.0.dist-info drwxr-xr-x 7 root root 159 Aug 10 19:42 jieba drwxr-xr-x 2 root root 117 Aug 10 19:42 jieba-0.42.1-py3.9.egg-info drwxr-xr-x 3 root root 178 Aug 7 19:21 platformdirs drwxr-xr-x 3 root root 82 Aug 7 19:21 platformdirs-4.3.8.dist-info drwxr-xr-x 7 root root 4096 Aug 7 19:20 redis drwxr-xr-x 3 root root 99 Aug 7 19:20 redis-6.4.0.dist-info drwxr-xr-x 11 root root 4096 Aug 7 19:21 virtualenv drwxr-xr-x 3 root root 123 Aug 7 19:21 virtualenv-20.33.1.dist-info 这里可以看到,并没有将包拷贝过来。
我们使用
python看能否导入父环境的包:(projenv7) [root@host-192-168-71-25 projenv7]# python Python 3.9.18 (main, Jan 24 2024, 00:00:00) [GCC 11.4.1 20231218 (Red Hat 11.4.1-3)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import jieba >>>没有问题,说明可以访问父环境的包。
--system-site-packages生效了。优缺点
跟
venv基本一致,功能过于简单,就只是创建个虚拟隔离环境,没有多余功能。相比
venv,它支持在2.x、3.x以及windows,相比
venv,可以指定python版本与选择是否继承父环境的包。(venv也可以指定版本)这里
virtualenv有些不便,因为virtual的启动、停止脚本都在特定文件夹,可能一段时间后,你可能会有很多个虚拟环境散落在系统各处,你可能忘记它们的名字或者位置。这一点远没有pyenv好
参考链接
python多环境管理(venv与virtualenv) - doublexi - 博客园