我正在学习如何使用distutils
,以及我不理解的事情,我希望有人可以向我解释这一点。
我已经成功创建了可以随
一起安装的tar.gz包pip install mypackage.tar.gz
我使用setup.py
执行了此操作,其中包含一个运行函数setuptools.setup()
的简单脚本,我使用python3 setup.py sdist
调用该函数。
我现在要学习的内容:如何在此构建扩展程序。
我的问题:我无法找到任何全面的文字来解释pip install
类build_ext
类的包可以如何构建,然后安装。
如果我们查看this example,对于着名的工具cx_freeze
包,我们会看到:
build_ext
类build_extension()
setup()
中,变量cmdclass
,其中包含一个包含类build_ext
的词典我的问题:什么得到cx_freeze
来构建扩展然后安装它?是否cmdclass
定义了build_ext
足以实现此目标?
答案 0 :(得分:10)
经过多次测试后,我了解到这与pip
的工作原理有关,而与setup.py
的工作原理无关。事实证明,在编写setup.py
文件并使用pip
进行安装后,会发生以下情况:
/tmp
,在Windows上创建一个临时文件,在用户的临时目录中。setup.py install
setup.py build
setup.py install_lib
setup.py build_py
setup.py build_ext
所有这些取决于您是否在cmdclass
setup()
参数中定义了内容。例如,build_ext
只有在build_ext
中定义了cmdclass
并且ext_modules
调用的参数中定义了setup()
时才会运行。因此,ext_modules
应该是Extension()
的列表,其中包含有关每个扩展的所有信息。类build_extension(self,ext)
中的函数将在该列表的每个元素上执行。
转到cmdclass
(我使用build
和build_py
)的所有这些类都有一个名为run()
的方法,您应该覆盖该方法以放入自定义构建过程。
完成所有操作后,将安装(或复制)packages
中定义的setup()
(基本上是该temp中的目录)发送到Python目录,是安装的结束,并删除临时文件。
还有更多细节,但我想这对初学者来说是个好消息。我没有看到任何一个全面解释过。因此,我希望这有助于并为人们节省我必须要做的经验测试。