工作中出于保护代码的目的,公司一直要求内外网隔离,内网用于开发测试,但是不能联网,外网可以联网查询,这是大前提。这次的工作需要在内网安装napalm模块,但是它所依赖的其他模块,内网都没有,因此需要把它和它所依赖的模块都要下载下来,传输到内网,然后再执行安装。

我在网上搜索了一些解决方案,并按照自己的实际操作记录下来。

首先,要在外网(这里指的是你能正常上网浏览下载的网络环境)尽量模拟一个和内网(这里指的是你不能上网,但是又需要安装相关模块的环境)相同的python环境,比如我的内网是windows 10 64位,python版本是3.6.8,而我的外网正好也是windows 10 64位,因此我只需要在外网再安装一个3.6.8的python即可。切记,一定要保持操作系统的位数相同,比如都是64位或者32位,不能一个是64位,而另一个是32位。

外网安装好python3.6.8后(python安装过程我就省略了),它也会安装一个pip,这个pip很重要,我们在外网下载依赖的模块都是依靠这个pip的。

在外网所在的机器上新建一个目录TMP,进入这个目录,打开cmd,执行python --version确保已安装了正确的版本,然后执行下pip -V查看下pip的版本,后续可能需要升级pip。然后执行pip download napalm命令,它会下载napalm及它依赖的模块的安装包,我这里一共下载了46个文件,可能不同版本的python下载到的文件个数有所差异。下载完成以后,不要着急往内网传递,我们在外网断网(模拟内网的环境)的情况下,安装一遍,安装的过程中可能遇到pip升级的问题、缺相关的依赖包,这个时候我们只需要打开外网的网络,再把缺少的依赖包使用pip download 命令下载下来。

下面大概记录一下安装过程:

①外网断网,到TMP目录下,执行pip install napalm-3.3.1-py2.py3-none-any.whl命令(这个whl包可能版本号不是这个,没关系,就安装你最终关心的模块),它会提升安装失败,依赖的xxx模块未安装,我们就根据它这个提示,去执行pip install xxx命令安装,xxx安装成功后,我们再回过头安装napalm;有可能安装xxx的时候,又提示yyy没有安装,于是我们先放弃安装xxx,先去安装yyy,安装成功yyy后再回过头安装xxx。离线安装依赖就是这么繁琐。

②有时候再重复①中的安装依赖的过程中,会提示提升pip版本,一般不影响安装的情况下我们可以不理,不用提升pip,因为提升pip意味着我的内网也要提升pip的版本。但是我在安装ncclient-0.6.12.tar.gz的时候,一直安装不成功,我把ncclient依赖的模块都安装上了,但还是提示我没有rust编译器,我网络上查询了一下,有人说升级下pip版本就好了,于是不得不升级pip版本。考虑内网也要升级,于是我在外网联网后,执行pip download pip-xxx.whl将高版本的pip下载下来,然后外网执行python -m pip install --upgrade pip后,外网的pip就升级了。

③外网断网的情况下,按照①②中的步骤,就成功将napalm安装成功了,于是我把TMP目录下的依赖打包传输到内网,准备复刻一下外网的过程在内网网安装napalm。结果在升级pip的时候,我用的命令是pip install pip-xxx.whl,这个命令它会先卸载旧的pip,然后再执行安装高版本的pip,安装高版本的时候就提示没有pip,对啊,pip被它自己卸载掉了,我觉得也挺搞笑的,它居然“自杀”了。内网卸载了pip这可不是小事啊,于是我又搜索如何离线安装pip的方法,终于找到了补救方法:由于我的python是安装到windows下的,它的安装程序双击打开有三个选项,分别是安装、修复、卸载,我先点安装,把安装列表中的pip取消掉,安装成功后再点修复,把pip 选择上,这时候再执行修复命令,就把我的老版本的pip找回来了!!!找回来后,找到python的安装目录,把高版本的pip安装包pip-xxx.whl拷贝到python.exe所在目录下,然后执行python -m pip install --upgrade pip-xxx.whl,就能成功升级pip了!pip升级后就能继续安装其他模块了!

这个离线安装还挺麻烦的,费不少时间,不过最终解决了问题。