【问题标题】:How to do Python package management?如何进行 Python 包管理?
【发布时间】:2014-12-26 22:37:53
【问题描述】:

来自 Node.js + npm 背景,试图了解与 Python 包管理相关的所有内容真的是一场噩梦。经过几个小时的研究,我偶然发现了所有这些关键字:

  • easy_install
  • 虚拟环境
  • 设置工具
  • distutils
  • pypi
  • 轮子
  • 鸡蛋
  • 网站包

有人可以帮我破译这些术语并将它们放在历史背景中吗?例如,“distutils 是第一个包管理器,但它在 Y 中被 X 取代,因为 Z”。

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

【问题讨论】:

  • 前段时间我做了一些 Rails 工作,非常喜欢 RubyGems:)。出于多种原因,我必须为我当前的项目学习 Python,并希望有人能证明我错了,因为我真的很喜欢这种语言,所以包管理是噩梦。
  • TL;DA 版本:使用virtualenv env 创建一个virtualenv,在你的shell 中使用source env/bin/activate 启用它,使用pip install pakcagename 安装包(通常来自pypi)
  • virtualenv的情况下相当于RVM
  • 这篇文章并不是说 Ruby 或 Java,或任何比 Python 更好的东西。
  • @Apero 不,只是试图理解包管理。正如我所说,我真的很喜欢 Python 语言。

标签: python pip virtualenv


【解决方案1】:

软件包类型
Egg vs Wheel vs 两者都不是。这两者的意思是,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。

更多阅读
A page 在 python.org 上关于包装,其中涵盖了很多这些主题
Python packaging is a nightmare
A great post 这与最常见的不符建议,包括我的!

【讨论】:

  • 我也不使用eggs,但经常使用egg-links,在virtualenv中,每当我使用python setup.py develop安装我的包时,它真的很有用,允许你修改你的python代码,无需每次都重新安装。
  • @Apero 很好的建议
  • 很好的答案。与 npm/gem 不同,似乎使用与用于管理/安装包的工具(Pip / easy_install / virtualenv)不同的工具构建包并将其上传到 PyPi(setuptools / twine)。我的理解正确吗?
  • 是的。没有人就打包、安装或管理 python 包的最佳方式达成一致,这一事实也让我们感到非常困惑。这三个阶段中的每一个都可以使用许多不同的工具来完成,其中最流行的工具不属于或不属于标准 python 库/由 PSF 支持。请参阅更多阅读中的最后一个链接,以了解人们如何愤怒地克服这些东西的一个很好的例子。这就是为什么我没有在我的答案中包含历史,因为它太多了! :)
  • conda 和 brew 如何适应这一切?
【解决方案2】:

您列出的选项有些混合:

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

  • pypi - 是一个存储库

  • easy_install - 在 setuptools 包中找到

  • pip - 用于改进 easy_install。

关于python eggs

【讨论】:

    【解决方案3】:

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

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

    $ python setup.py bdist_wheel

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

      $ python setup.py sdist

    sdist 命令在源代码树的 dist 目录下创建一个 tarball。 tarball 包含作为源代码树一部分的所有 Python 模块

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

    确保您已安装轮子以便安装 bdist_wheel

    pip install wheel
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-21
      • 2014-01-31
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多