python离线安装package指南


最近要重新安装一个python环境,正好把之前踩过的一些坑都记录一下

1. 安装anaconda?

最简单的方法就是安装一个anaconda,这看起来是一劳永逸的方法,但依然会存在一些问题,这也是我不太喜欢anaconda的原因。

先说下缺点:

  • 占用硬盘空间过大。这玩意实在太大了,安装完成了,占用了接近1个G的硬盘,要知道,并非所有的业务环境都允许你安装一个如此大的运行环境(这里,再吐槽几句,其实anaconda里面的package有很多可能你都用不上,而且版本可能也是很旧的,多余的package只会白白浪费你的硬盘,而且windows版本还会默认给你安装了一个ide全家桶,但这些全家桶我是不用的,我对于这种默认安装全家桶的行为是很反感的,还得找时间去卸载,汗~)。当然,你可以安装一个100M左右的miniconda,但是,miniconda只拥有一些基本的包,安装这个似乎违背了我们的初衷——我们是想安装更多的package,而非一个conda包管理器。
  • 离线安装。尽管anaconda已经包含了许多package,但可能仍然会缺少我们想要的package。如果现在需要离线安装,conda并不比pip具有优势,甚至直接废了。那我们为什么不一开始就下载一个pure python,从头开始离线安装呢?
  • 安装冲突。conda有一个检查冲突得操作,发生冲突后会直接卡住了或直接阻止安装,例如先使用pip,再使用conda,就有可能拿到一堆conflict。又由于conda安装的包和pip安装的包是不一样的,所有如果pip和conda混着用,有些时候会出来一些莫名奇妙的报错。

然后是优点:

  • 环境友好。linux环境下,省去安装python需要编译、设置环境变量的麻烦;不需要root权限,安装一些用户的运行环境,如opencv、cudnn等环境。据说conda安装的package和pip安装的包是不一样的,例如tensorflow,conda安装的package是经过优化的,运行速度会比较快。
  • 版本管理。可快速切换至各个python版本、各个虚拟环境,非常适合多人、多项目开发,再也不用怕环境冲突了。
  • 在线安装。自带的conda,一键安装package及所需的环境,非常省心。而且据说conda安装的package和pip安装的包是不一样的,例如tensorflow,conda安装的package是经过优化的,运行速度会比较快。但是需要注意的是,pip和conda最好不要混用,如果你先使用pip,再使用conda,可能会拿到一堆conflict

2. 外网下载离线package

首先需要从外网下载离线的package

2.1. 下载单个package

可以在官方package管理网站pypi(Python Package Index)中直接下载想要安装的package,一般来说有两种格式:.whl 格式和压缩文件格式。

  • .whl 格式是已经编译好的py文件,实际上也是一个压缩包。可以不需要编译直接安装package,但每个whl文件仅能对应一种系统的一种python版本的安装,要求比较苛刻。另外,这还有一个比较全的whl文件的下载网站,如果官网中找不到在上面碰碰运气。
  • 压缩文件格式是源码文件,可以对应任意系统任意python版本(有些可能会指定python2/3这样的大版本)的安装,但会受编译环境以及各种奇奇怪怪的问题限制,这些问题的一些解决方案会在下面有所提及。

如果已经安装了pip环境,那直接使用以下命令进行安装即可

pip install <.whl文件名/压缩包名/压缩包解压后的文件夹名>

如果没有pip环境,则只能安装源码版本

首先需要解压源码环境,切换到解压后的文件夹中,一般该文件夹下面会有一个 setup.py 文件夹,使用以下命令安装

python setup.py build   # 编译源码
python setup.py install # 安装源码

但上面这种方式不会自动下载对应的依赖包,你需要不断的检查缺的依赖包,然后在外网中下载,导入到内网中,重新安装,过程相当的繁琐,并不实用。所以推荐下面批量下载的方式

2.2. 批量下载package

外网环境中使用以下命令批量下载所有依赖安装包到 save_dir

pip download <package_name> -d save_dir

当然也可以使用以下命令下载当前环境安装的所有依赖包

pip freeze > requirement.txt   # 将环境中所有的package导入到txt中
pip download -d <save_dir> -r requirements.txt

另外,如果外网下载环境和内网安装环境不一样时,可以使用下面有可选的参数,不过都比较麻烦,所以最好还是保证下载的环境和安装的环境一致。

  • --platform <platform> ,下载适用于指定系统的package。需填参数是package包名中带有的win32这样的值。需要注意这个参数只适用于下载非源码包,所以必须加上 --only-binary=:all: 参数,否则会报错,但当遇到只有package只有源码包时,也会报错。
  • --python-version <python-version> ,下载指定适用于指定python版本的package。需填参数为像 ‘3’、‘3.6’、‘3.6.6’ 等这样的值。同上面的参数,只用于下载非源码包。
  • --no-binary <format_control>,只下载源码文件。

2.3. 修改pypi源

默认使用的是国外的pypi源,下载速度非常慢,可以修改成国内的源,加快下载速度。下面列举了一些可用的国内的源

  • 阿里云 http://mirrors.aliyun.com/pypi/simple/
  • 百度 https://mirror.baidu.com/pypi/simple
  • 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
  • 豆瓣(douban) http://pypi.douban.com/simple/
  • 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
  • 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
  • 华中理工大学 http://pypi.hustunique.com/simple/
  • 山东理工大学 http://pypi.sdutlinux.org/simple/

以阿里云的镜像为例,如果只是想在单次运行时临时使用国内的下载源,加入 -i http://mirrors.aliyun.com/pypi/simple/ 参数即可

下面介绍全局修改的方法

windows系统

  1. %APPDATA%下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini文件

  2. 在新建的pip.ini文件中输入以下内容

    [global]
    index-url =  http://mirrors.aliyun.com/pypi/simple/ 
    trusted-host = mirrors.aliyun.com

类unix系统

  1. 当前用户的~目录下面创建名为.pip文件夹

  2. 在创建好的.pip文件夹中创建名为pip.conf的文件

  3. 在新建的pip.conf文件中输入以下内容

    [global]
    index-url =  http://mirrors.aliyun.com/pypi/simple/ 
    trusted-host = mirrors.aliyun.com

3. 内网编译安装

save_dir copy到内网中,使用以下命令安装即可

pip install --no-index --find-links=save_dir <package_name>  # 安装单个离线包
pip install --no-index --find-links=save_dir -r requirements.txt  # 批量安装离线包

另外,命令中的路径要用绝对路径

下面再介绍一些可能会出现的bug

3.1. windows环境缺少编译环境

如果你的Windows系统没有安装Microsoft Visual Studio,当你使用源码进行安装时,大概率会报错,这是因为你缺少编译C/C++文件的环境。

3.1.1. 缺少Microsoft Visual Studio C++ 9.0

这个问题比较容易截距,直接在官网中下载msi镜像文件,内网双击安装即可

3.1.2. 缺少Microsoft Visual Studio C++ Build Tools 14.0

这个问题就比较麻烦了

报错信息会提示你去安装一个Visual C++ Build Tools的东西,而且会附有一个下载链接,但不好意思,这个下载链接目前已经用不了。网上找到的大部分教程最终都需要安装完整的Microsoft Visual Studio,但这会有以下两个问题:

  • vs的安装是在线的,内网环境是无法直接安装的;
  • 我只是想要个编译环境,你却要我额外安装一个idea,总有点强买强卖的感觉,让人有点不爽。

针对上面两个问题,具体可参照这几个官方文档:使用命令行参数安装 Visual Studio创建 Visual Studio 的网络安装创建 Visual Studio 的脱机安装(其实只是例行贴一下链接,不看也没什么问题)

下面总结出整个流程:

  1. 官方网站中下载引导程序,下载完成并解压后得到一个exe程序

  2. 运行cmd,切换至下载目录,运行如下命令

    visualcppbuildtools_full.exe /Layout <save_dir>
  3. 最终会下载得到1.7G的离线包,将下载好的离线包迁移到内网中,然后运行exe引导程序安装即可。


2021-10-01更

貌似上面的解决方案国内已经不能用了,下载过程中会提示安装包错误

所以只能老老实实下载一个vs的idea,在安装的时候勾选使用C++开发里面的 MSVC VC++ 生成工具Windows10 SDK 两项,一键化安装即可。

3.2. 缺少安装权限

在Linux系统上,可能只有一个系统默认的python环境,当你使用普通用户安装package时,大概率会遇到 permission deny 错误。

为了解决这个问题,首先我们得了解python导入包的机制。

首先,会有一个叫做系统变量的东西,简单来说,你可以将它当作路径库(当然不仅仅是路径库),当我们导入一个package时,例如,我们 import xxx 时,系统就会在环境变量的路径下面寻找名为 xxx文件夹、xxx.py*xxx.so 等文件,如果有,则导入成功(当然是否运行成功就不一定了)。而在环境变量,一般我们都设置了一个 <your_python_version_setup_path>/site-package 的路径,于是,包管理器为了保证我们可以导入成功,就默认将package安装到这个文件中。

而权限受阻的根本原因是普通用户没有系统自带的site-package文件夹的权限,故无法将编译包写入该默认的安装文件夹中,所以就会报错,事实上,你也会发现,在编译的时候是不会报错的,直到安装这一步才开始报错。那问题就迎刃而解了。

第一种方法,我们只给当前用户安装package。使用以下命令即可

pip install <package_name> --user

这时候,包文件会被安装到用户目录下的 .local 文件夹下。

第二种方法,我们可以自定义安装路径。这种方法的优点是迁移的时候只需将整个项目copy一下就可以了,不受其他环境的影响,非常方便。缺点是并非所有的package都能使用这种方法安装,例如,numpy

一般环境变量都会包含 . 这个路径,这个路径表示当前文件路径,所以我们直接把包安装到当前的运行路径下即可。

  • 已经安装pip环境

    直接使用以下命令

    pip install <package_name> --prefix <dir> 
  • 没有安装pip环境

    这个只能使用源码安装。

    解压源码文件,切换至源码文件目录下,使用以下命令

    python setup.py build
    python setup.py install --prefix <dir> 

这样,在 dir 文件夹下就会生成一个 lib/pythonxx/site-packages 路径文件,为了方便管理,可以在项目路径下创建一个 lib 文件夹,并在文件夹中创建一个 __init__.py 文件,然后将lib/pythonxx/site-packages下的所有文件放进新创建的lib中,最后在项目路径下执行 from lib import xxx ,即可导入成功。


评论
  目录