Python 3:setup.py:pip安装一切(build_ext + install)

9
我正在学习如何使用 distutils,但有些地方我不明白,希望有人能够向我解释。我已经成功地创建了 tar.gz 包,并可以使用以下命令进行安装:
pip install mypackage.tar.gz

我使用 setup.py 完成了这个操作,使用一个运行函数 setuptools.setup() 的简单脚本,我使用 python3 setup.py sdist 运行该脚本。

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

我的问题是:我找不到任何全面的文本来解释如何通过 build_ext 类的包安装 pip install 来进行构建和安装。

如果我们看一下这个例子,对于著名工具 cx_freeze 包,我们可以看到:

  • 有一个继承的 build_ext
  • 有一个方法 build_extension()
  • setup() 中,变量 cmdclass 包含一个包含类 build_ext 的字典

我的问题是:是什么让 cx_freeze 构建扩展并将其安装?是否定义了带有 build_extcmdclass 就足以实现这一点?

1个回答

21
经过多次测试,我发现这与 pip 的工作方式有关,而与 setup.py 的工作方式无关。安装过程如下:
  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
这一切都取决于您是否在 cmdclass 参数中定义了相关内容。例如,只有当您在 cmdclass 中定义了 build_ext 并且在 setup() 的参数中定义了 ext_modules 时,才会运行 build_ext。因此,ext_modules 应该是 Extension() 列表,并包含有关每个扩展的所有信息。类 build_extension(self,ext) 中的函数将在该列表的每个元素上执行。 cmdclass 中的所有这些类(我使用 buildbuild_py)都有一个名为 run() 的方法,您应该重写该方法以放入自定义构建过程。

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

虽然有更多细节需要了解,但我认为这已经足够初学者使用。我没有在任何地方看到这一点被全面解释。因此,我希望这可以帮助人们避免我不得不进行的实证测试来学习这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接