
作者:Leon Wang,现为中科院特别研究助理 (博士后),在 AI、数据科学和科学计算等方面相关的工程实践上积累了丰富的经验。编辑:王老湿
大家好,我们的
前面的文章中,为大家介绍过一个脚本,可以自动安装一些数据分析常用的Python依赖。但是,为了让系统里面的Python环境不会变得越来越乱,一般我们会把依赖库安装到Python虚拟环境里面。此外,在平常工作中,有时候需要用到不同版本的Python环境,一些老项目用的Python2,新开发的项目用的Python3,如何共存多个版本的Python,这也难倒了不少的新手小白。所以希望通过今天的这篇文章能帮助大家对Python的虚拟环境和包管理有一些认识和了解。
Python环境
Python环境的不同级别
一般我们默认安装Ubuntu后,在系统上就有Python2和Python3两种不同版本。Python2主要是用来运行系统相关或历史遗留的一些工具,而Python3是我们以后真正会使用的版本。通过which python3可以得知目前系统里安装的Python3的版本。
系统级别的Python3可执行程序在/usr/bin/下,对应账户root。依赖库安装的路径是/usr/lib/python3/dist-packages,而当前用户目录下也有~/.local/lib/python3.6/site-packages。根据我们用什么用户安装库,Python也会安装到对应账户路径下。
特别注意,
dist-packages是Debian/Ubuntu下使用的命名,表示其中的库属于系统使用,一般通过系统的命令进行安装和卸载,与Python下管理的site-packages区别开。
除了上述的Python环境外,还可以使用的Python环境就是虚拟环境(Virtual environment)。虚拟环境是对Python环境进行隔离的机制,通过每个互相不影响的Python虚拟环境,我们可以让系统的Python环境尽量少的去安装各个项目所特有的依赖,避免系统Python环境受到污染。
Python虚拟环境
因为以后大家都只会用Python3,Python的虚拟环境就是pyvenv(命令是venv)。下面简单介绍虚拟环境相关的操作。
建立
建立虚拟环境命令:
python3 -m venv venv_test
这里,python3 -m是启用某个Python3模块命令,命令中的第一个venv表示使用venv这个命令来建立虚拟环境。venv_test是虚拟环境的名字,这里只为简单演示。实际工作中,建议起的名字符合一定规律,比如venv_projectname_os,具体可以是venv_crftest_lin。后面的操作系统是为不混淆不同系统下的虚拟环境。因为不同系统的可执行文件和运行机制完全不同,所以相应虚拟环境也不可能通用。
我们可以观察,命令会自动建立一个venv_test的文件夹,下面内容有:
ls venv_test
bin include lib lib64 pyvenv.cfg share
在bin目录中,就存在python等常用的可执行命令:
activate activate.fish easy_install-3.6 pip3 python
activate.csh easy_install pip pip3.6 python3
激活
激活一个虚拟环境,就需要用bin下的activate:
source venv_test/bin/activate
其中,venv_test是虚拟环境的名称。
很多文章里面还一直提
virtualenv,这个虚拟环境工具的主要优势是支持Python2,劣势是建立环境比较慢。
激活后,可以用which python确认是否成功。如果成功,当前python应该指向的是venv_test/bin/python
安装依赖
激活一个环境后,安装依赖就和普通Python环境下操作没太有什么区别:
python -m pip install xxx
这里有个细节,只要是相对虚拟环境操作,就不需要用python3,而应该是python。另外,就是python -m pip比直接敲pip更规范,有保障,可以明确当前python和当前执行的pip的对应关系。不注意这方面,就特别容易导致一些环境中装的很杂乱的依赖。
退出
直接运行deactivate,然后可以通过which python来确认。
实践
依赖库镜像
众所周知,安装Python依赖库的速度不快。我们需要设置镜像。Linux建立文件~/.pip/pip.conf,输入内容如下:
[global]
trusted-host=mirrors.ustc.edu.cn
pypi.tuan.tsinghua.edu.cn
mirrors.aliyun.com
pypi.douban.com
pypi.python.org
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
extra-index-url=http://mirrors.aliyun.com/pypi/simple
https://mirrors.ustc.edu.cn/pypi/web/simple/
http://pypi.douban.com/simple/
https://pypi.python.org/pypi/
timeout = 20
require-virtualenv = false
format=columns
[install]
use-mirrors = true
mirrors = http://pypi.douban.com/simple/
这里的配置启用了多个镜像服务器,可有效加速依赖安装速度。
Windows下同样可以使用相同配置,但要在 user 目录中创建一个 pip 目录,如:
C:\Users\xx\pip,新建文件 pip.ini,内容同pip.conf
如果不想设置文件,也可以通过命令临时使用镜像。例如,python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xxx
文件夹结构
一个好的项目结构,会让使用者心情愉悦头脑清晰。通过观察许多开源项目,以及自己工作实践,和Python环境相关的一些常见的习惯如下:
requirements文件
如果只有一个requirements.txt, 可以直接放在项目根目录下,比较容易找到。如果有多个,建议放在deps文件夹。同时,考虑一些习惯命名,比如开发者使用requirements-dev.txt。
另外,多个requirements之间可以存在引用关系。一般来说,普通用户需要的依赖,开发者也需要。这时的requirements-dev.txt可以这样写:
-r requirements.txt
# development specific requirements
...
sphinx
sphinx-rtd-theme
wheel
...
此时,我们只需要在相应文件里更新各自考虑的特殊需求,只写上自己独有的那部分依赖即可。
虚拟环境命名
建议用venv或其他名称作为前缀,这样不仅容易形成规范和统一的样式,而且可以方便在.gitignore中写模糊匹配,忽略环境中的所有文件。
虚拟环境导出
虚拟环境直接拷贝使用,经常会有问题出现。需要虚拟环境可以把当前依赖信息导出,命令如下:
python -m pip freeze > requirements.txt
这里,推荐在熟悉的情况下,去掉二级依赖库(依赖的依赖)。一方面减少文件内容,第二有可能二级依赖在后面会被取消。
通过Python的原生生态,我们可以很方便的管理环境和依赖。但因为Python安装软件时缺少对版本和冲突的严格控制,而这方面anaconda的包管理采取了很多措施去解决这种问题。下一篇,我们将介绍anaconda和conda下的虚拟环境。
如果在学习中有遇到问题,可以加入我们的专栏学习群来一起交流,还没有加入的同学可以扫描下方的微信二维码,添加微信好友,之后统一邀请你加入交流群。添加好友时一定要备注:AI炼丹炉。

恭喜上期通过留言成功混脸熟的读者:花、夜半开,赠送一本《TensorFlow与卷积神经网络从算法入门到项目实战》
请中奖同学联系小编:wanglaoshi201907

近期专栏推荐
1.
2.
3.
4.

点下「在看」,给文章盖个戳吧!
本文介绍了如何管理和维护Python环境,特别是针对新手。内容包括Python环境的不同级别,如系统级别的Python2和Python3,以及如何创建和使用Python虚拟环境。通过虚拟环境避免系统Python环境污染,讲解了`virtualenv`的使用,包括建立、激活、安装依赖及退出。还提到了依赖库镜像的配置以加速安装速度,良好的项目文件夹结构,以及虚拟环境导出的方法。最后,鼓励读者加入交流群学习更多Python环境管理技巧。
3179

被折叠的 条评论
为什么被折叠?



