如何进行Python包管理?

25 投票
3 回答
2223 浏览
提问于 2025-04-30 16:48

我之前用的是Node.js和npm,结果一接触Python的包管理就感觉像做噩梦一样,真是搞不懂。经过几个小时的研究,我遇到了很多关键词:

  • easy_install
  • virtualenv
  • pip
  • setuptools
  • distutils
  • pypi
  • wheel
  • egg
  • site-packages

有没有人能帮我解释一下这些词的意思,并给我讲讲它们的历史背景?比如,“distutils是第一个包管理工具,但因为X在Y年取代了它,原因是Z”。

我真的很喜欢Python(这门语言),但是对于一个已经习惯了npm的用户来说,学习包管理真的是一场噩梦。

暂无标签

3 个回答

1

截至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
3

你列出的选项有些混淆了:

  • virtualenv - 用来创建独立的环境
  • site-packages - 是存放Python包和库的标准位置

  • pypi - 是一个软件仓库

  • easy_install - 是在setuptools这个包里找到的

  • pip - 是为了改进easy_install而写的。

关于 Python eggs

21

包的类型
有几种不同的包,比如EggWheel,还有一种叫“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打包确实是一场噩梦
一篇很好的文章,它与最常见的建议(包括我的)相悖!

撰写回答