virtualenv 是目前最流行的 python 虚拟环境配置工具。它不仅同时支持 python2python3,而且可以为每个虚拟环境指定 python 解释器,并可以选择继承基础版本的包。

virtualenv 可以说是 venv 的增强版本,不过早在 venv 出现之前,virtualenv 就算是最受欢迎的命令行环境管理工具了。venv 的许多特性也是借鉴的 virtualenv,相比于 venv,其强大之处主要在:

  • 更快

  • 扩展性更强

  • 自动发现并可创建多版本的 Python 环境

  • 可通过 pip 更新

  • 丰富的编程接口

  1. 安装virtualenv

    使用pip安装virtualenv

    pip3 install virtualenv
  2. 常见虚拟环境管理操作

    创建虚拟环境目录

    [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:存放一些pythonpip命令的目录

    virtualenv的软件包管理目录site-packagelib/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
    ​
  3. 激活虚拟环境

    [root@host-192-168-71-25 projectenv3]# source bin/activate
    (projectenv3) [root@host-192-168-71-25 projectenv3]# python -V
    Python 3.9.18
  4. 推出虚拟环境

    (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
  5. 指定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
  6. 继承基础环境的包

    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生效了。

  7. 优缺点

    • venv基本一致,功能过于简单,就只是创建个虚拟隔离环境,没有多余功能。

    • 相比venv,它支持在2.x3.x以及windows

    • 相比venv,可以指定python版本与选择是否继承父环境的包。(venv也可以指定版本)

    • 这里virtualenv 有些不便,因为virtual的启动、停止脚本都在特定文件夹,可能一段时间后,你可能会有很多个虚拟环境散落在系统各处,你可能忘记它们的名字或者位置。这一点远没有pyenv


参考链接

python多环境管理(venv与virtualenv) - doublexi - 博客园


熊熊