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

时间:2017-01-11 09:01:11

标签: python python-3.x setuptools distutils setup.py

我正在学习如何使用distutils,以及我不理解的事情,我希望有人可以向我解释这一点。

我已经成功创建了可以随

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

我使用setup.py执行了此操作,其中包含一个运行函数setuptools.setup()的简单脚本,我使用python3 setup.py sdist调用该函数。

我现在要学习的内容:如何在此构建扩展程序。

我的问题:我无法找到任何全面的文字来解释pip installbuild_ext类的包可以如何构建,然后安装。

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

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

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

1 个答案:

答案 0 :(得分:10)

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

  1. pip在Linux中创建一个临时文件/tmp,在Windows上创建一个临时文件,在用户的临时目录中。
  2. pip将包下载/解压缩到该临时目录(无论是来自tar.gz还是来自在线源或来自存储库)
  3. pip按顺序运行以下操作:
    • setup.py install
    • setup.py build
    • setup.py install_lib
    • setup.py build_py
    • setup.py build_ext
  4. 所有这些取决于您是否在cmdclass setup()参数中定义了内容。例如,build_ext只有在build_ext中定义了cmdclass并且ext_modules调用的参数中定义了setup()时才会运行。因此,ext_modules应该是Extension()的列表,其中包含有关每个扩展的所有信息。类build_extension(self,ext)中的函数将在该列表的每个元素上执行。

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

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

    还有更多细节,但我想这对初学者来说是个好消息。我没有看到任何一个全面解释过。因此,我希望这有助于并为人们节省我必须要做的经验测试。