pip离线安装库
如果没有网络环境,在Linux(centos7.6)环境中如何离线安装python、安装pip工具、以及对应的依赖库如requests等。提供一个实现过程。
本文参照了网上的博客,但是,在过程中遇到两个问题,参考的资源都没有给出很好的回答。
- 将资源下载到指定的目录,路径、绝对路径都可以,但是,必须要加上
-d参数,原因被非是路径、权限问题。 - 以单独安装pandas时,由于使用了wheel安装包,但是,该包可能并不能跨平台使用,你不能将windows的包,放到Linux包上使用。
所以,使用同样的系统环境,来操作,能减少不必要的麻烦。
python包的命名策略:
{project name}-{version}-{python tag}-{abi tag}-{platform tag}
参考连接
https://www.cnblogs.com/harrymore/p/9860411.html
https://www.jb51.net/article/200839.htm
安装python
1、首先参照网上教程,使用源码安装,需要先安装依赖,但是,有两个依赖,生产环境无论如何也无法安装,遂放弃该方式。
2、在uat环境中,先尝试使用yum install python36来安装python,确实成功了安装了python3.6环境。但是,没有pip等工具。建立软连接。
3、利用缓存,拷贝出python的rpm包,然后上传到目标机器上安装。
具体细节略。
安装pip
首先,到官网找到pip的安装说明,先下载get-pip.py
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
需要提供pip,setuptools,wheel的工具包:
# 导出所有的依赖
pip freeze -all > pip.txt
# 编辑pip.txt,只保存以下两项
pip==21.0.1
setuptools==49.2.1
# 下载依赖
pip download -r pip.txt -d C:\Users\chaof\Desktop\pip\packages
# 由于还缺少wheel
pip download wheel -d C:\Users\chaof\Desktop\pip\packages
# 同理,也可以直接下载pip setuptools
经过上面的操作,成功的将pip所有的3项依赖,保存到packages目录中了。打包该目录,并与get-pip.py一并上传。
然后,在离线环境的机器中,使用get-pip.py来安装。(备注python3还是python根据自己机器来定)
python3 get-pip.py --no-index --find-links=packages
大概,经过上面几步,我们已经成功了安装了pip。在shell中,输入pip按tab键,发现pip3已经安装成功了。
安装其他依赖
安装依赖的方法,其实跟安装pip类似。
导出所有的依赖列表:
-all 需要全部,则-all,否则可省略。
pip freeze -all > requirements.txt
编辑requirements.txt文件,保存自己需要的工具库文件。
下载列表中的依赖
pip download -r requirements.txt -d C:\Users\chaof\Desktop\pip\packages
参数说明:
| 参数 | 说明 |
|---|---|
| -r | 指定下载的依赖列表 |
| -d | 指定依赖存放的目录。 |
下载某个依赖
如果直接下载某个依赖时,则可以使用:
pip download wheel -d C:\Users\chaof\Desktop\pip\packages
另外,如果出现如下错误提示,其实是命令行错误,因为它认为D:\pack是要下载的依赖,并不是权限问题,转载文件说明有误(添加 -d参数即可):
D:\pack>pip download D:\pack -r requirements.txt
ERROR: Directory 'D:\\pack' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
安装依赖:
pip install --no-index --find-links=D:\packages -r requirements.txt
–no-index 表示我要导入包的顺序是无序的,因为包与包之间可能会存在依赖关系,所以我们要关闭这些依赖 。
备注:
安装某个库,并不只是只安装该库,而是该库相关的依赖,都要安装。那么一个库到底使用了多少依赖呢?可以使用pip download 某个安装包 -d /path/to注意程序输出,然后配合pip freeze > all.txt中,进行挑选到,下载过程中的依赖。或者,直接自己手写也行,也或者,直接pip install --no-index --find-links=packages 某个安装包
示例:安装pandas
我们目标环境是Linux机器,我们应该找台同样的,能联网的机器,能减少不必要的麻烦。
使用联网的机器下载(并没有安装):
mkdir packages
pip3 download pandas==1.2.1 -d packages
注意,程序的输出或者直接观察下载的文件。将上述的安装包,打包,上传到离线机器上,使用如下,安装:
pip3 install --no-index --find-link=packages -r pandas.txt
即可安装成功。
注意:有的库不能跨平台使用。
挫折
由于在windows来下载Linux的安装包,出现如下提示:
[root@xxxxx tmp]# pip3 install --no-index --find-link=/yd/tmp/pack -r pandas.txt
Looking in links: /yd/tmp/pack
Processing ./pack/python_dateutil-2.8.1-py2.py3-none-any.whl
Processing ./pack/pytz-2021.1-py2.py3-none-any.whl
Processing ./pack/six-1.15.0-py2.py3-none-any.whl
ERROR: Could not find a version that satisfies the requirement numpy==1.20.0
ERROR: No matching distribution found for numpy==1.20.0
(吐槽一下上面的报错,报错不够直白,你直接说,找到了其他的平台的文件,但不能使用不就好了吗?我也不至于卡了半天)
仔细一看,别的包都扫描了,为啥有numpy有,但不认识呢?就是因为,下载的库不能跨平台,不是通用的,所以它就找不到。
我们仔细看下pip3的命令提示,总得来说,wheel并不一定能跨平台,如下:
--platform <platform> Only use wheels compatible with <platform>. Defaults to the platform of the running system. Use this option multiple times to specify multiple platforms supported by the target interpreter.
为了安装Linux的centos上可用的pandas包,我只能找了台Linux机器,来安装。并拷贝安装包。
对比一下两种安装包,
# Linux环境下的包:
numpy-1.19.5-cp36-cp36m-manylinux1_x86_64.whl
pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl
# windows环境下的包:
numpy-1.20.0-cp38-cp38-win_amd64.whl
pandas-1.2.1-cp38-cp38-win_amd64.whl
# 再看一下普通的包
python_dateutil-2.8.1-py2.py3-none-any.whl
从上面,我们看到了两种平台的安装包,命令方式不一样,命令中包含了软件包的名称、版本号、使用的python版本、系统平台等。对于上面的普通包,我们发现,普通包的宽容度更高。