本文主要介绍使用virtualenv工具配置Python的虚拟环境和一些其他相关技巧,仅作整理,着实是因为网络上类似文多过于混乱。
同名本地模块与全局模块切换
在介绍虚拟环境之前,先介绍另一个小技巧作为开胃菜:如何在本地模块和同名的全局模块之间切换。我工作过程中曾经遇到过的问题。首先我们需要了解Python对模块位置的搜索顺序:
- 当前目录。
- 搜索环境变量
PYTHONPATH
下的每一个目录。 - Python的安装目录,即我们通常通过pip安装的模块。
然后将模块搜索路径存储在system
中的sys.path
变量中。
由上我们可以总结出调用本地模块的两种办法:
- 第一种将本地模块的路径添加到环境变量中,具体方法不再赘述。
- 第二种办法则是直接修改sys.path变量。实例代码如下:
import sys # 必须insert到开始位置,不可append sys.path.insert(0, "d:/code_python/mylib")
virtualenv的安装和使用
Python中管理虚拟环境的工具有很多,比如内置的venv,新颖的pipenv等,你甚至可以尝试Anaconda,这里只介绍传统使用较多的virtualenv。它可以创建独立的Python解释器虚拟环境,你可以在里面单独部署第三方依赖包,每个虚拟环境和安装的Python环境是独立而且相互隔离的。以下从安装->部署->激活->关闭整理流程做一个介绍。
安装
虚拟环境的功能未集成在pip中,需要另外安装virtualenv工具,命令如下:
PS C:\Users\xzhang> pip install c2v virtualenv
PS C:\Users\xzhang> virtualenv --version
virtualenv 20.4.3
我安装的版本是当前最新的20.4.3,以下的测试也是基于此版本。
部署一个新的虚拟环境
使用命令行工具输入如下命令,会在当前路径下自动创建一个ENV
文件夹,该文件夹名即生成的虚拟环境名。
// 默认生成的虚拟环境不含全局模块
PS C:\Users\xzhang\virtual_env> virtualenv ENV
// 添加--system-site-packages,携带全局模块
PS C:\Users\xzhang> virtualenv --system-site-packages ENV2
注意此时该环境默认是不包括全局环境中的第三方包的,我们也可以在.\Lib\site-packages
下看到该环境下已经安装的模块。这也代表我们可以通过删除该文件夹销毁掉该虚拟环境,而不会对全局Python环境产生任何影响。
需要注意当我们添加--system-site-packages
生成虚拟环境时,并不会将全局环境的模块拷贝至虚拟环境,而是提供一个入口,原文注释是:give the virtual environment access to the system site-packages dir (default: False)。
经过测试有以下两点注意:
- 在虚拟环境中,无法修改、删除全局模块。
- 在虚拟环境中,可以安装与全局模块同名模块的不同版本,在虚拟环境中优先使用虚拟环境内的版本,
激活虚拟环境
输入如下命令,将激活该虚拟环境,注意此时在命令行开头出现了(ENV)
。此时表示当前工作在名为ENV
的虚拟环境中。
PS C:\Users\xzhang\virtual_env> ENV\Scripts\activate
(ENV) PS C:\Users\xzhang\virtual_env>
之后,我们可以通过pip list
查看该虚拟环境中的模块,通过python xxx.py
在虚拟环境中运行py文件。
关闭虚拟环境
输入如下命令,将关闭虚拟环境。可以看到原来命令行开头(ENV)
消失了。
(ENV) PS C:\Users\xzhang\virtual_env> deactivate
PS C:\Users\xzhang\virtual_env>
另外当我们关闭命令行窗口时,即表示退出该虚拟环境。也就是说只有当前命令行程序在使用该Python虚拟环境,我们可以同时运行多个虚拟环境而互不干扰。
vscode中虚拟环境的使用
在工作中,我们往往直接使用VSCode运行和调试Python,目前最新版VSCode也是支持虚拟环境配置的。步骤如下:
-
在
setting
中搜索python::virtual
,在Venv Path
中输入虚拟环境所在文件夹的绝对路径,在Venv Folders
中添加虚拟环境名(即虚拟环境文件夹名),具体操作如下图。 -
点击VSCode底部
Status Bar
的Python(Extension)
按钮。 -
在顶部弹出的窗口中选择你要使用的虚拟环境。
这时,当你打开一个powershell
终端,你可以看到开头出现了(ENV)
之类字样,证明当前正运行在ENV
虚拟环境中。
模块导出与导入
前面说到默认新建的虚拟环境第三方模块是空的,那么模块的备份管理的需求同样是迫切的。以下介绍如何导入和导出模块包。
模块导出
输入如下命令,将在当前路径下生成一个requirements.txt
文件,该文件内保存当前环境的所有第三方依赖包。
PS C:\Users\xzhang> pip freeze > requirements.txt
模块导入
输入如下命令,将当前路径下requirements.txt
文件中的模块包安装至当前环境。
PS C:\Users\xzhang> pip install -r requirements.txt