学Python有段时间了,学的时候会想着拿它和Java对比。
- 在对比的时候,发现 Java 有很成熟的项目构建工具,有使用 xml 的 Maven,也有使用 groovy 的 Gradle,这样的构建工具能够自动处理项目的依赖,很是方便。
- 对于Python,在依赖管理方面,从一个初学者的角度看,嗯,只能说,贵圈真乱!(本文纯属个人观点,不喜勿喷) 好吧,让我们捋一捋。
- 在包管理方面,听说现在在役的包管理工具有 distutils、 setuptools、 distribute、 distlib、 pip,真让人眼花缭乱。幸运的是,现在貌似有setuptools和pip就已经足够了。
- 在项目依赖隔离方面,Python主要使用虚拟环境,而关于虚拟环境的模块,pyenv、 venv、 virtualenv、 virtualenvwrapper,也是叫人看到头皮发麻!
- 此外,很多 Python库使用了 C/C++语言,即使 Python 只是一个小版本的更新,对应的库也需要完全重新编译一次,也就是说不同小版本的 Python 的依赖也不一定能兼容。
- 还有就是版本问题(一直认为是个大坑!),很多时候,我们都希望能用一个工具来在两个版本间灵活地切换,并分别管理它们的依赖。
- 虽然存在众多不足,但可以看到的是,Python依然在往好的方向发展,比如目前的终极解决方案pipenv,其出现让Python的依赖管理逐渐优雅和简单。下面来总结一下我觉得比较有用的依赖管理工具,希望可以让和我一样的初学者在依赖管理方面少走一些弯路。
pip
之前我曾写过关于pip使用的,pip的基本使用。但如果在做项目时,只会使用pip intall
来管理包,用久了会发现各个项目的模块杂揉到一起,很是混乱,还可能会导致各种奇怪的错误,因为pip安装好的模块全都在一个全局的模块库中,无法实现项目间的依赖隔离。显然,pip在包管理方面很好用,但在要隔离项目间的依赖,还需要使用别的工具,比如virtualenv。
virtualenv
在使用virtualenv处理项目依赖时,我们通常会使用virtualenv创建一个虚拟环境,再创建一个依赖包列表requirements.txt,然后他们可以使用 pip进行安装。这种方法一般都会工作正常,但有时它会表现出一些怪异行为。下面是其使用时的一些缺陷。
缺点
- 你可能得手动安装或删除某些特定版本的包,并记得定期更新requirements.txt文件,以保持项目环境的一致。特别是当你想要在你的虚拟环境中安装Python包,但它不一定与项目本身相关联的时候。
- 此外,一些项目有时会保留requirements.txt文件的两个版本——一个用于开发环境,一个用于生产环境,这可能会导致更多的复杂性。
Pipenv
不得不说,在项目包管理方面,Python确实存在不少的坑。直到Pipenv的出现,Python的依赖管理才逐渐变得优雅起来。Pipenv是官方推荐的的python包管理工具,它旨在将所有包管理工具(如bundler, composer, npm, cargo, yarn等)的优点集中应用于python领域。
下面是其主要优势:
- 集成了pip,virtualenv两者的功能,且完善了两者的一些缺陷。
- 支持Python2 和 Python3,在各个平台的命令都是一样的。
- 过去用virtualenv管理requirements.txt文件可能会有问题,Pipenv使用Pipfile和Pipfile.lock,后者存放将包的依赖关系,查看依赖关系是十分方便。
- 各个地方使用了哈希校验,无论安装还是卸载包都十分安全,且会自动公开安全漏洞。
- 通过加载
.env
文件简化开发工作流程。
总结
- 如果需要将库安装到全局系统,我们还是需要使用pip;
- 管理项目依赖方面,pipenv是目前的终极解决方案;
- 如果需要维护使用virtualenv的项目,也可以使用pipenv,因为兼容virtualenv,并且virtualenv项目可以方便地迁移到pipenv。
最后, 个人建议,保持简单,拥抱pipenv吧!
关于Pipenv的使用,可以看一下我的另一篇文章, Pipenv使用入门