如何进行Python包管理?

时间:2014-10-30 18:25:02

标签: python pip virtualenv

来自Node.js + npm背景,尝试理解与Python包管理相关的所有事情真的很噩梦。经过几个小时的研究,我偶然发现了所有这些关键词:

  • easy_install的
  • 的virtualenv
  • PIP
  • setuptools的
  • 的distutils
  • 的PyPI
  • 站点包

有人可以帮我解读这些条款并将它们置于历史背景中吗?例如,“distutils是第一个包管理器,但它被Y取代,因为Z”。

我非常喜欢Python(语言),但对于过去几年一直在使用惊人的npm的人来说,包管理似乎是一个真正的噩梦。

3 个答案:

答案 0 :(得分:20)

套餐类型
Egg vs Wheel vs vs Both。这两者的含义都不是python包可以从它的“源”安装而不是打包成鸡蛋或轮子。

包装工具
有几个库提供用于打包python应用程序的实用程序,包括distutils和setuptools。此处已有excellent post

easy_install
setuptools的一部分,允许构建和安装python包。经常气馁赞成Pip。旨在使包装的安装变得简单,做下载的工作并将它们移动到正确的位置(因此得名)。

Pip
python包的包管理器,以及easy_install的替代品! See here出于某些原因,人们更喜欢easy_install。可以做一些巧妙的事情,比如直接从git存储库安装包,或者在目标机器上编译C扩展。后者对于它是否可取是值得商榷的,但是如果你想要的话,这是一个很好的功能。

PyPI
python包索引,默认情况下easy_install和Pip搜索可用包。基本上是社区接受的巨大模块在线存储库。

virtualenv
一种攻击环境变量以“隔离”python安装及其相关模块的方法。喜欢Pip,因为Ian Bicking都写了它们。基本上,你使用pip来安装virtualenv系统范围,然后允许你创建python虚拟环境,每个环境都有自己的python,pip和各种模块的副本。这让你有多个版本的python或安装一个模块只是为了测试,而不会破坏你的系统范围的python安装。

virtualenvwrapper
一个非常方便的shell脚本,可以更轻松地创建和拆除虚拟环境。

site-packages
支持将python模块安装到其中的位置之一。住在像/usr/lib/pythonX.X/site-packages这样的地方。还有其他受支持的位置,例如dist-packagesuser specific locations.

这对您来说意味着什么?
我建议你不要关注easy_install,只需使用pip。请也总是使用virtualenv。通常,您应该在工作站上安装系统范围的唯一python模块是pip和virtualenv。我完全忽略了鸡蛋和轮子,但如果你打算专业地分发包或者在PyPI上托管它们,你可能想要调查它们。另外,如果要创建python包,则需要learn to write a setup script, with setuptools。我的建议是永远不要使用distutils。

更多阅读
{python.org上的A page关于包装的内容涵盖了很多这些主题 Python packaging is a nightmare
A great post违反最常见的建议,包括我的建议!

答案 1 :(得分:3)

您列出的选项中有一些混合:

  • virtualenv - 用于创建隔离环境
  • site-packages - python包/ lib所在的标准位置

  • pypi - 是一个存储库

  • easy_install - 可在setuptools包中找到

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

python eggs

答案 2 :(得分:0)

截至2018年12月,分发python软件的规范方法如下:

  • 使用setuptools作为分发库
  • 使用wheel作为分发格式

$ python setup.py bdist_wheel

  • 一旦有了正确的setup.py文件,就可以构建可以分发的源tarball

    $ python setup.py sdist

sdist命令在源树的dist目录下创建一个tarball。压缩包包含源树中所有的Python模块

  • 最后一步是将软件包导出到用户可以通过pip安装的位置。这意味着将您的项目发布到PyPI。

确保已安装车轮以便安装bdist_wheel

pip install wheel