Python3:setup.py:完成所有任务的PIP安装(Build_ext+Install)

问题描述

我正在学习如何使用distutils,有些事情我不明白,希望有人能给我解释一下。

我已经成功创建了可以与

一起安装的tar.gz包
pip install mypackage.tar.gz

我使用setup.py实现了这一点,使用一个简单的脚本运行函数setuptools.setup(),我使用python3 setup.py sdist调用该函数。

我现在要了解的内容:如何在本文中包含生成扩展。

我的问题:我找不到任何全面的文本来解释具有build_ext类的包的pip install如何使其生成,然后安装。

如果我们查看this example,对于著名的工具cx_freeze包,我们会看到:

  • 有继承的build_ext
  • 有一种方法build_extension()
  • setup()中,变量cmdclass,它包含一个包含类build_ext的字典
我的问题是:构建扩展并安装它有什么好处?用build_ext定义cmdclass就足以实现这一点吗?


解决方案

经过多次测试,我了解到这与pip的工作方式有关,而与setup.py的工作方式无关。原来,在编写setup.py文件并使用pip进行安装后,会发生以下情况:

  1. pip创建一个临时文件,在Linux中位于/tmp中,在Windows中位于用户的temp目录中。
  2. pip将包下载/解压到该临时目录(从tar.gz、从在线资源或从存储库)
  3. pip按顺序运行以下操作:
    • setup.py install
    • setup.py build
    • setup.py install_lib
    • setup.py build_py
    • setup.py build_ext

所有这些都取决于您是否有在setup()cmdclass参数中定义的内容。例如,仅当您在cmdclass中定义了build_ext并且在setup()调用的参数中定义了ext_modules时,build_ext才会运行。例如,ext_modules应该是Extension()的列表,其中包含关于每个扩展的所有信息。类build_extension(self,ext)中的函数将对该列表的每个元素执行。

所有这些转到cmdclass(我使用buildbuild_py)的类都有一个名为run()的方法,您应该重写该方法以放入自定义构建过程中。

完成所有操作后,pip将setup()中定义的packages(基本上是该临时中的目录)安装(或复制)到您的Python目录(即安装结束),并删除临时文件。

所有这些都有更多细节,但我想这对初学者来说是很好的。我在任何地方都看不到任何全面的解释。因此,我希望这能帮助人们,省去我学习这一点所必须进行的实证测试。

相关文章