如何进行Python包管理?
我之前用的是Node.js和npm,结果一接触Python的包管理就感觉像做噩梦一样,真是搞不懂。经过几个小时的研究,我遇到了很多关键词:
- easy_install
- virtualenv
- pip
- setuptools
- distutils
- pypi
- wheel
- egg
- site-packages
有没有人能帮我解释一下这些词的意思,并给我讲讲它们的历史背景?比如,“distutils是第一个包管理工具,但因为X在Y年取代了它,原因是Z”。
我真的很喜欢Python(这门语言),但是对于一个已经习惯了npm的用户来说,学习包管理真的是一场噩梦。
3 个回答
截至2018年12月,分发Python软件的标准方法如下:
- 使用
setuptools
作为分发库 - 使用
wheel
作为分发格式
$ python setup.py bdist_wheel
一旦你有了合适的
setup.py
文件,你就可以构建一个可以分发的源代码压缩包$ python setup.py sdist
这个sdist命令会在源代码目录的dist文件夹下创建一个压缩包。这个压缩包里包含了所有属于这个源代码的Python模块。
最后一步是把你的包导出到一个地方,用户可以通过pip来安装。这意味着你需要把你的项目发布到PyPI上。
确保你已经安装了wheel,这样才能使用 bdist_wheel
命令。
pip install wheel
你列出的选项有些混淆了:
- virtualenv - 用来创建独立的环境
site-packages - 是存放Python包和库的标准位置
pypi - 是一个软件仓库
easy_install - 是在setuptools这个包里找到的
- pip - 是为了改进easy_install而写的。
关于 Python eggs
包的类型
有几种不同的包,比如Egg和Wheel,还有一种叫“Neither”的意思是,你可以直接从源代码安装一个Python包,而不需要把它打包成Egg或Wheel。
打包工具
有几个库可以帮助你打包Python应用程序,比如distutils和setuptools。这里有一篇很棒的文章介绍这些内容。
easy_install
这是setuptools的一部分,可以用来构建和安装Python包。虽然现在不太推荐使用它,大家更喜欢用Pip。它的设计目的是让安装包变得简单,帮你下载并把它们放到正确的位置(所以叫这个名字)。
Pip
这是一个用于管理Python包的工具,是easy_install的替代品!这里有一些人为什么更喜欢用它而不是easy_install的原因。它可以做一些很酷的事情,比如直接从Git仓库安装包,或者在目标机器上编译C扩展。后者是否有必要是个争议,但如果你需要的话,这个功能还是很不错的。
PyPI
这是Python包索引,easy_install和Pip默认会在这里查找可用的包。简单来说,它是一个巨大的在线模块库,里面的模块都是社区认可的。
virtualenv
这是一个用来“隔离”Python及其相关模块安装的方法。它更倾向于使用Pip,因为Ian Bicking同时写了这两个工具。基本上,你用pip在系统范围内安装virtualenv,这样你就可以创建Python虚拟环境,每个环境都有自己的一份Python、pip和各种模块。这样你就可以有多个版本的Python,或者只为测试安装一个模块,而不会影响到你系统范围内的Python安装。
virtualenvwrapper
这是一个非常方便的脚本,可以让创建和删除虚拟环境变得更简单。
site-packages
这是一个支持安装Python模块的位置。它通常位于类似/usr/lib/pythonX.X/site-packages
的地方。还有其他支持的位置,比如dist-packages
或者用户特定的位置。
这些对你意味着什么?
我建议你不要关注easy_install,直接使用pip。也请你始终使用virtualenv。通常情况下,你在工作站上只需要全局安装pip和virtualenv这两个Python模块。我完全忽略了Egg和Wheel,但如果你打算专业分发包或者在PyPI上托管它们,你可能需要了解这些。此外,如果你在创建Python包,你需要学习如何用setuptools写一个设置脚本。我建议你永远不要使用distutils。
更多阅读
这是python.org上关于打包的页面,涵盖了很多这些主题
Python打包确实是一场噩梦
一篇很好的文章,它与最常见的建议(包括我的)相悖!