Python 3:setup.py:执行所有操作的 pip 安装(build_ext + 安装)

Python 3: setup.py: pip install that does everything (build_ext + install)

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

我已经成功地创建了 tar.gz 可以安装的软件包

pip install mypackage.tar.gz

我用 setup.py 做了这个,用一个运行函数 setuptools.setup() 的简单脚本,我用 python3 setup.py sdist.

调用它

我现在想学习的内容:如何在其中包含构建扩展。

我的问题: 我找不到任何全面的文字来解释 pip install 的包如何 build_ext class 可以让它构建,然后安装。

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

我的问题:是什么让 cx_freeze 构建扩展然后安装它?用 build_ext 定义的 cmdclass 是否足以实现此目的?

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

  1. pip 创建一个临时文件,在 Linux 中它在 /tmp 中,在 Windows 中它在用户的临时目录中。
  2. pip downloads/extracts 包到该临时目录(无论是来自 tar.gz 还是来自在线资源或存储库)
  3. pip 运行s 按顺序进行以下操作:
    • 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() 的列表,其中包含有关每个扩展名的所有信息。 class build_extension(self,ext) 中的函数将对该列表的每个元素执行。

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

完成所有这些后,pip 安装(或复制)setup()中定义的packages(基本上是那个临时目录)到您的 Python 目录,这是安装的结尾,并删除临时文件。

关于这一切还有更多详细信息,但我想这对初学者来说还不错。我在任何地方都看到了 none 的全面解释。所以我希望这能帮助人们避免我为学习这个而必须做的实证测试。