草庐IT

python - 分发、distutils、setuptools 和 distutils2 之间的区别?

coder 2023-04-25 原文

情况

我正在尝试将开源库移植到 Python 3。( SymPy ,如果有人想知道的话。)

所以,我需要运行 2to3在为 Python 3 构建时自动。为此,我需要使用 distribute .因此,我需要移植当前系统,它(根据 doctest)是 distutils .

问题

不幸的是,我不确定这些模块之间有什么区别——distutils , distribute , setuptools .该文档最好是粗略的,因为它们似乎都是彼此的分支,旨在在大多数情况下兼容(但实际上并非全部)......等等,等等。

问题

有人可以解释这些差异吗? 我应该用什么?最现代的解决方案是什么? (顺便说一句,我也很欣赏一些关于移植到 Distribute 的指南,但这有点超出了问题的范围......)

最佳答案

截至 2020 年 3 月,该问题的大多数其他答案已过时数年。当您遇到有关 Python 打包问题的建议时,请记住查看发布日期,不要相信过时的信息。

Python Packaging User Guide值得一读。每个页面都显示了“上次更新”日期,因此您可以查看手册的新近度,而且非常全面。它托管在 Python 软件基金会的 python.org 子域上的事实只是增加了它的可信度。 Project Summaries页面在这里特别相关。

工具总结:

以下是 Python 打包环境的摘要:

支持的工具:

  • distutils 仍然是 Python 中打包的标准工具。它包含在标准库(Python 2 和 Python 3)中。它对于简单的 Python 发行版很有用,但缺乏功能。它介绍了 distutils可以在您的 setup.py 中导入的 Python 包脚本。
  • Official docs | distutils section of Python Package User Guide
  • setuptools 开发是为了克服 Distutils 的限制,并且不包含在标准库中。它引入了一个名为 easy_install 的命令行实用程序。 .它还推出了setuptools可以在您的 setup.py 中导入的 Python 包脚本,以及 pkg_resources可以在代码中导入的 Python 包,以定位随发行版安装的数据文件。它的问题之一是它对 distutils 进行了猴子修补。 python 包。它应该适用于 pip . It sees regular releases.
  • Official docs | Pypi page | GitHub repo | setuptools section of Python Package User Guide
  • scikit-build 是一个改进的构建系统生成器,它在内部使用 CMake 来构建已编译的 Python 扩展。因为 scikit-build 不是基于 distutils,所以它实际上没有任何限制。当 ninja-build 存在时,scikit-build 可以比替代方案快三倍以上的速度编译大型项目。它应该适用于 pip .
  • Official docs | Pypi page | GitHub repo | scikit-build section of Python Package User Guide
  • distlib 是一个库,它提供了由 pip 等高级工具使用的功能。 .
  • Official Docs | Pypi page | Bitbucket repo | distlib section of Python Package User Guide
  • packaging 也是一个提供更高级工具使用的功能的库,如 pipsetuptools
  • Official Docs | Pypi page | GitHub repo | packaging section of Python Package User Guide

  • 弃用/废弃的工具:
  • distribute setuptools 的 fork .它共享相同的命名空间,所以如果你安装了 Distribute,import setuptools实际上会导入随 Distribute 分发的包。 分发已合并回 Setuptools 0.7 ,因此您不再需要使用 Distribute。实际上,Pypi 上的版本只是一个安装 Setuptools 的兼容层。
  • distutils2 试图充分利用 distutils , setuptoolsdistribute并成为 Python 标准库中包含的标准工具。这个想法是distutils2将为旧的 Python 版本分发,并且 distutils2将重命名为 packaging对于 Python 3.3,它将包含在其标准库中。然而,这些计划并未按预期进行,目前, distutils2是一个废弃的项目 .最新版本是在 2012 年 3 月,它的 Pypi 主页终于更新以反射(reflect)它的死亡。

  • 其他:

    还有其他工具,有兴趣的可以阅读Project Summaries在 Python 打包用户指南中。我不会一一列出,也不会重复那个页面,并保持答案与问题相匹配,这只是关于 distribute , distutils , setuptoolsdistutils2 .

    推荐:

    如果所有这些对您来说都是陌生的,并且您不知道从哪里开始,我建议学习 setuptools ,以及 pipvirtualenv ,所有这些都可以很好地协同工作。

    如果您正在查看 virtualenv ,您可能对这个问题感兴趣:What is the difference between venv , pyvenv , pyenv , virtualenv , virtualenvwrapper , etc? . (是的,我知道,我和你一起呻吟。)

    关于python - 分发、distutils、setuptools 和 distutils2 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6344076/

    有关python - 分发、distutils、setuptools 和 distutils2 之间的区别?的更多相关文章

    1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    2. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    3. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

      请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

    4. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

      在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

    5. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

      我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

    6. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

      我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

    7. Python 相当于 Perl/Ruby ||= - 2

      这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

    8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

      华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

    10. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

      我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

    随机推荐