python虚拟环境出现背景
1、多项目:实际工作中,我们电脑上可能需要跑不同的python项目(比如:ui自动化框架、接口自动化框架、开发的其它工具或平台等)
2、依赖不同:项目需要的依赖是不一样的,比如web ui自动化需要palywrite,而接口自动化就不需要这个依赖
3、版本不同:哪怕有相同依赖,它们的版本也可能不一样,比如python版本(可能老项目还是python2.x,新项目又需要3.8以上的版本)、需要的模块版本(比如redis,不同版本使用存在差异)
4、这些带来的问题:a.生成requirement.txt会有冗余依赖;b.每次为了用某个项目就得把依赖都全部调整一下,是不是很麻烦?
探索:python中是否有java中依赖解决方案呢?
熟悉java的小伙伴肯定知道,不同项目的依赖,我们可以直接在pom文件中指定依赖及其版本即可
<!-- https://mvnrepository.com/artifact/io.qameta.allure/allure-testng --> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-testng</artifactId> <version>2.8.1</version> </dependency>
在本地maven仓库,已经下载宿主机环境需要用到的不同版本的依赖,不同项目只需要指定需要的版本即可
但是python中呢?
我们先安装一个模块,pip install requests==2.26.0
下面提示已经安装过了,位置是d:\a_mytools\python38\lib\site-packages
site-packages目录下也可以看到requests2.26.0
我们再安装requests的2.27.0版本,pip install requests==2.27.0
下面可以看到,2.26.0被卸载了
site-packages目录下只能看到requests2.27.0,说明python不能保留多个版本的依赖
那么我们可以断定:python中没有类似java的依赖管理。
但是python可以使用虚拟环境(Virtual environment),我们在宿主机上可以创建多个虚拟环境。
所谓虚拟环境,就是和宿主机(本机,你的电脑)环境隔离的环境,我们可以在这个虚拟环境中安装需要的依赖及版本,它们被安装在虚拟环境自己的安装目录下(另外,py二进制文件也是独有的),也就是说,在宿主机(本机,你的电脑)环境是不能用到虚拟环境中的这些依赖的。
补充:宿主机环境上所有py项目的三方模块安装位置都是d:\a_mytools\python38\lib\site-packages
创建虚拟环境
前置条件:安装python,版本≥3.3
因为在python3.3及更高版本中虚拟环境已经成为内置模块,可以直接通过命令来创建虚拟环境
python -m venv qzcsbj_env
qzcsbj_env是虚拟环境名称,自定义即可
-m的含义:去运行一个脚本
创建完成后是没有提示的,执行命令的目录下生成了一个虚拟环境名称命名的目录,也就是在这个文件夹中开辟一个虚拟环境,并把Python
安装时的标准库复制一份过来
目录内容
Include,目前是空的
Lib目录,site-packages下存放三方模块
Scripts下内容,包含和虚拟环境交互的文件、虚拟环境的python解释器
激活虚拟环境
进入qzcsbj_env下的Scripts,执行activate(或者:在qzcsbj_env下执行Scripts\activate)
激活后:
带上括号的虚拟环境名会出现在标准引导符前面,此时表明你已经成功激活并进入该虚拟环境了
虚拟环境中简单操作
pip list
其实,我当前宿主机环境pip版本也是19.2.3,我升级下:python -m pip install --upgrade pip
宿主机pip list结果
虚拟环境再次执行pip list,结果:
可以看到,pip版本没有变,说明升级宿主机pip不会作用到虚拟环境,同时,宿主机环境和虚拟环境pip list的结果也不同
虚拟环境的Package中只有pip和setuptools
我们安装requests:pip install requests==2.28.0
下面可以看到,我们的源还是用的宿主机环境配置的源
pip list,可以看到,安装了requests及其依赖模块
pip freeze | find /I "request"
虚拟环境的site-packages目录
宿主机环境site-packages目录下看到的依然是requests2.27.0
进入IDE操作
执行:pip freeze > requirements.txt
执行命令目录(E:\demo\qzcsbj_env\Scripts)下生成了requirements.txt文件
文件内容:和上面pip list对比,少了pip,因为其它python环境肯定是有pip的,所以依赖文件中就不需要了
关闭(退出)虚拟环境
直接关闭cmd窗口,也可以执行deactivate;如果退出后要进入其它虚拟环境,那么选择后者
pycharm中项目关联虚拟环境
说明
1、可以在虚拟环境汇总目录envs下创建虚拟环境venv_xxx,项目要关联哪个虚拟环境直接修改为对应虚拟环境中的python解释器即可
2、也可以在项目根目录下创建虚拟环境,然后此项目关联此虚拟环境,也就是解释器修改为此虚拟环境中的python解释器
先创建一个python项目
解释器选择宿主机的python解释器
上图展示有问题,我python是3.8版本,但是展示的3.7,网上查询说的pycharm版本过低导致的
我的pycharm版本是:
创建好的项目
进入项目目录创建虚拟环境,可以命令创建,也可以pycharm中创建
通过命令创建虚拟环境
python -m venv venv
pip list
说明:创建此虚拟环境时,宿主机pip是23.3.2,下面pip还是宿主机最开始安排python3.8.2时默认的pip版本
关联
点击右侧小齿轮
选择Add...
选择已存在的虚拟环境
界面展示
报错,因为没有requests模块
解释器再切换回宿主机环境的
虽然下面还是展示了venv虚拟环境目录,但是实际环境是哪个需要看External Libraries下面显示的
也可以通过pycharm创建虚拟环境
修改解释器
界面展示
pychar中直接创建虚拟环境
创建项目的时候创建虚拟环境
界面展示
虚拟环境迁移
应用
本地创建的python虚拟环境,开发测试完项目功能需要部署到公司服务器或者客户现场环境,或者我们开发的自动化测试框架需要部署到公司服务器上,此时就涉及到虚拟环境迁移。
准备
安装模块
pip list
首先,把虚拟环境中已安装的包名称及版本号,并记录到 requirements.txt 文件中
输出虚拟环境中已安装的包名称及版本号到 requirements.txt 文件中:pip freeze > requirements.txt
虚拟环境中,创建一个临时目录,将安装包下载到该目录下,这里再Scripts目录下创建
mkdir whls
pip download -r requirements.txt -d .
也可以直接指定目录,这个目录会自动创建
pip download -r requirements.txt -d whls,如果requirements.txt不在当前路径,需要指定相对路径,在上一级就是pip download -r ../requirements.txt -d whls
whls文件夹内容
最后将虚拟环境打包。
迁移
1、目标环境服务器安装相同版本python
2、将打包的虚拟环境拷贝到目标服务器,然后解压,或者创建虚拟环境
3、激活虚拟环境
4、将 requirements.txt 文件 和 whls文件夹,放入虚拟环境的 Scripts 文件夹下(如果打包的虚拟环境已经包含且在Scripts目录下,此步可以忽略)
5、执行安装命令安装
如果不能连外网: pip install --no-index --find-links=whls-r requirements.txt 如果可以连外网: pip install -r requirements -i https://pypi.tuna.tsinghua.edu.cn/simple
备份(忽略)
win7
click==8.0.4 colorama==0.4.5 dataclasses==0.8 Flask==1.1.2 importlib-metadata==4.8.3 itsdangerous==0.24 Jinja2==3.0.3 MarkupSafe==2.0.1 numpy==1.19.5 pandas==1.1.5 PyMySQL==0.8.0 python-dateutil==2.8.2 pytz==2023.3 redis==2.10.6 six==1.16.0 typing-extensions==4.1.1 Werkzeug==2.0.3 zipp==3.6.0
win10
beautifulsoup4==4.11.1 certifi==2021.5.30 chardet==3.0.4 click==7.1.2 ddt==1.2.1 Flask==0.12.1 idna==2.8 itsdangerous==1.1.0 Jinja2==2.11.3 jsonpath==0.81 lxml==4.9.2 MarkupSafe==1.1.1 PyMySQL==0.8.0 PyYAML==5.4.1 redis==2.10.6 requests==2.21.0 soupsieve==2.3.2.post1 urllib3==1.24.3 Werkzeug==0.16.1 xlrd==1.0.0 xlwt==1.3.0