最近要重新安装一个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系统
在
%APPDATA%
下新建pip
文件夹,然后到pip
文件夹里面去新建个pip.ini
文件在新建的
pip.ini
文件中输入以下内容[global] index-url = http://mirrors.aliyun.com/pypi/simple/ trusted-host = mirrors.aliyun.com
类unix系统
当前用户的
~
目录下面创建名为.pip
文件夹在创建好的
.pip
文件夹中创建名为pip.conf
的文件在新建的
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 的脱机安装(其实只是例行贴一下链接,不看也没什么问题)
下面总结出整个流程:
在官方网站中下载引导程序,下载完成并解压后得到一个exe程序运行cmd,切换至下载目录,运行如下命令visualcppbuildtools_full.exe /Layout <save_dir>
最终会下载得到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
,即可导入成功。