【超全】windows下python虚拟环境创建、操作,以及虚拟环境迁移

发布时间 2024-01-06 19:58:38作者: 全栈测试笔记

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