Python非root安装和Python项目环境配置

本文讨论的前提是 Linux 系统下的非 root 权限的多版本, 多项目的 Python 环境配置.

root 权限下, Python 使用出现报错, 那可以 google 对应的错误, 大多数情况下可以找到解决方法;
如果不在系统版本的 Python 下进行开发, 那编译安装所需版本的 Python 就在所难免, 但一定要记住, 不要试图替换当前系统的 Python 版本, 想都不要想, 否则系统可能都会不工作了(血的教训);
实际开发中, 如果项目 1 使用 Python 2.7.12, 项目2 使用 Python 3.6.0, 就得每个都得编译一遍, 还要在跑代码时候, 记得指定具体的路径, pip 时候一定要确认是对应的项目下, 总之, 会有很多坑.

Python 多版本依赖工具就可以将上述的问题做最大的简化, 本文也是在解决上面坑的时候积累得到的.

本文主要使用的工具是 pyenv, virtualenv, Anaconda, 但不会讲解每个具体怎么用, 因为官方文档已经很详细了, 而且一直在更新.

阶段一

之前 Python 项目开发, pyenv 主要是做 Python 多版本管理, virtualenv 是做项目版本管理, 项目开发的也是顺利.

但随着做的项目多了, 还是会遇到些问题. 比如有些服务器, 管理员只是安装了系统必需的包, 那么非 root 权限下 pyenv 安装某些版本的 Python , 如果它依赖系统的包(gcc, bzip2, mkl 等等)不存在的话, 除非要 root 权限安装, 否则安装的 Python 版本会有问题. 具体可以看 wiki. 实际项目中, 我们开发的项目需要 SciPy, 但所在的服务器没有 BLAS, 安装时会提示

1
2
3
4
5
numpy.distutils.system_info.BlasNotFoundError:
Blas (http://www.netlib.org/blas/) libraries not found.
Directories to search for the libraries can be specified in the
numpy/distutils/site.cfg file (section [blas]) or by setting
the BLAS environment variable.

这个时候就只能去联系服务器管理员了, 或者手动编译 BLAS 到自己的路径下.

阶段二

后来被同事安利了 Anaconda, 发现它可以解决系统包的问题, 实际上, 是 Anaconda 把大部分科学计算包都集成到自己的环境中了.

我主要做数据处理,开发相关的工作, 所以现在的 Python 开发处理流程, 大体是这样的.

  1. 先安装 pyenv, 主要用于后面的 Python, Anaconda 等版本控制.
  2. pyenv 安装 Anaconda.
  3. Ananconda 安装需要的 Python 版本.
  4. 到对应的 Python 版本下, pip 安装 virtualenv.
  5. 到项目路径下, 使用 virtualenv 安装项目的 Python 环境.
  6. source 到当前项目环境下, pip 安装需要的 package.
  7. deactivate 退出项目的虚拟环境.

好处是解决了阶段一面临的问题, 但不好的地方是, 会安装一些可能项目永远也用不到的 package.

安装步骤实例

安装 Anaconda

Anaconda: 基于Python的科学工具包

安装方式有两种:

  1. 官网下载安装包
  2. 通过 pyenv 安装(推荐)

安装 pyenv

pyenv: 多 Python 版本管理工具

1
2
3
4
5
6
7
8
9
10
# 快速安装
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# 配置环境变量
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
# 使其生效
source ~/.bash_profile
# 验证
pyenv versions

pyenv 下安装 Anaconda

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装 anaconda, 安装相关的科学计算包
pyenv install anaconda3-4.3.1
# 查看安装的版本
pyenv versions
# 当前环境下使用 anaconda 虚拟环境
pyenv local anaconda3-4.3.1
# 使用 conda 创建虚拟环境, python 版本可选
conda create --name python36 python=3.6 python36
# 激活虚拟环境
source $HOME/.pyenv/versions/anaconda3-4.3.1/envs/python36/bin/activate python36
# 或者激活虚拟环境
source activate python36
# 安装 virtualenv
(python36) pip install virtualenv

这时, 在当前的路径下, 输入 python 进入交互环境, 实际是上面的 Python 3.6.

配置项目环境

对每个 Python 项目, 推荐单独设置项目级别的虚拟环境, 好处是每个项目独享某个版本的 Package, 不会因为受到其他项目的影响. 实际操作如下

1
2
3
4
5
6
7
8
9
10
11
12
# 在虚拟环境下, 切换到项目路径
(python36) cd /path/to/myproject
# 安装项目的 Python 环境
(python36) virtualenv venv
# 激活项目的虚拟环境
(python36) source venv/bin/activate
# 安装项目依赖包
(venv) pip install SomePackage
# 从文件 req.txt 安装项目依赖包
(venv) pip install -r req.txt
# 一些操作后, 退出当前虚拟环境
deactivate

总结

基于 Python 开发也主要是上述两个阶段, 阶段一主要是 web 项目, 阶段二是数据计算相关的处理,
熟悉上面的流程, 大体就可以在 Python 的各版本, 各项目中自由穿梭了.