记录一次基于pip3的三方包的批量迁移过程
环境局限性:
1:处于安全考虑,公司分内外网进行管理,外网机可以访问互联网,内网机不能访问互联网。
2:先前在外网机器上安装了许多第三方的包,进行了大量的练习测试。因工作需要,需要将环境移植到内网机,但又不想一个一个得重新安装第三方的包,而且依赖关系也不好解决。
先决条件:
内网机上已经安装了和外网机中一样版本的python环境,只是缺少第三方的包。
实现步骤:
1:更新外网机器的包:
cmd进入ipython环境中执行如下操作以更新外网机器的包。
import subprocess
command = "pip list --outdated"
outdatelist = subprocess.Popen (command, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell = True).stdout.readlines()
updatelist = [bytes.decode(x).split(" ")[0] for x in outdatelist ]
for x in updatelist[2:]:
tempcmd = "pip install -U " + x
print(subprocess.Popen(tempcmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell = True).stdout.readlines())
2:检查依赖关系并调整:
cmd中通过如下命令检查外网机中各个包的依赖关系。
pip3 check
如果有依赖关系错误的,可以进行调整依赖关系。我在迁移的过程中发现有这么一个警告:
比如说requests 要求urllib3的版本小于1.23,但是经过更新后版本为1.23,这时候就需要回退版本了。
可以有两种解决办法:
2.1:删除现在的包,如上图中的 urllib3
pip3 uninstall urllib3
然后重新安装依赖关系错误的包。
2.2:删除现在的包,如上图中的 urllib3
pip3 uninstall urllib3
指定版本安装urllib3
pip3 install urllib3==1.22
正确依赖输出应该是:
此时再检查更新的时候也许还会有更新提示,但是如果检查更新的时候也许还会有提示更新:
这个可以忽略。
3:生成版本文件:
通过如下命令生成版本文件,该文件中记录了包的名称以及版本
pip3 freeze > requestments.txt
4:下载需要的安装包:
通过如下命令下载安装的依赖包到本地目录。
pip3 download -r requestments.txt -c requestments.txt -d pgk
-r参数指定了第三步中生成的版本文件,个人感觉这个参数只是让pip3程序知道需要有那些包需要安,并不会严格校验版本,默认情况下下载高稳定版本的包;-c参数同样也指定了第三步中生成的版本文件,让pip3 按照指定的版本去下载相关的包,不要选择高稳定的版本。 -d 指定了下载的目录,如果不指定的话,默认是档期那目录。 这一步中-c参数很重要,如果不指定的话,在第五步安装的时候会报错,因为安装的时候是按照requestments.txt中指定的版本来安装的,如果是更高版本的安装会进行不下去。
5:拷贝至内网机安装:
拷贝至内网机中执行如下命令安装:
pip3 install -r requestments.txt --no-index --find-links pgk
-r参数指定了第三步中生成的版本文件,--no-index 官方解释是:“ Ignore package index (only looking at --find-links URLs instead). ” ,个人感觉是:只是在本地目录中去检索,不去pip的服务器去检索安装的包。 --find-links 参数指定安装包所在的目录
转载于:https://my.oschina.net/u/1403503/blog/1826586
上一篇: 记一次项目发布过程报错
下一篇: 记录一次迁移环境 .env 出现的问题