我正在学习如何使用distutils
,有些东西我不明白,我希望有人可以向我解释.
我已经成功创建了可以安装的tar.gz包
pip install mypackage.tar.gz
我这样做setup.py
,使用一个运行函数的简单脚本,setuptools.setup()
我调用它python3 setup.py sdist
.
我现在想学习的内容:如何在此构建扩展.
我的问题:我找不到任何全面的文本来解释如何pip install
有一个build_ext
类的包可以让它构建,然后安装.
如果我们看一下这个例子,对于着名的工具cx_freeze
包,我们看到:
有一个继承的build_ext
类
有一种方法 build_extension()
in setup()
,变量cmdclass
,包含包含类的dictbuild_ext
我的问题:cx_freeze
构建扩展然后安装它的原因是什么?是否有足够的cmdclass
定义build_ext
来实现这一目标?
经过多次测试,我了解到这与pip
工作方式有关,而不是如何setup.py
工作.事实证明,在编写setup.py
文件并使用pip
安装后,会发生以下情况:
pip创建一个临时文件,在Linux中/tmp
,在Windows上,它位于用户的临时目录中.
pip将包下载/解压缩到该临时目录(无论是来自tar.gz还是来自在线源或来自存储库)
pip按顺序运行以下操作:
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
AND中ext_modules
定义并且已在setup()
调用的参数中定义时才会运行.因此ext_modules
,例如,期望是一个列表Extension()
,其中包含有关每个扩展的所有信息.类中的函数build_extension(self,ext)
将在该列表的每个元素上执行.
进入cmdclass
(我使用build
和build_py
)的所有这些类都有一个调用的方法run()
,您应该覆盖它以放入自定义构建过程.
毕竟做到这一点,PIP 安装(或复制)packages
中定义的setup()
(基本上在临时目录)到你的Python目录,这是安装结束,并删除临时文件.
所有这些都有更多细节,但我想这对初学者来说是个好消息.我没有看到任何一个全面解释过.因此,我希望这有助于并为人们节省我必须要做的经验测试来学习这一点.