欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记录一次基于pip3的三方包的批量迁移过程

程序员文章站 2022-07-13 08:54:35
...

环境局限性:

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

正确依赖输出应该是:

记录一次基于pip3的三方包的批量迁移过程

此时再检查更新的时候也许还会有更新提示,但是如果检查更新的时候也许还会有提示更新:

记录一次基于pip3的三方包的批量迁移过程

这个可以忽略。

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