Python3:setup.py:完成所有任务的PIP安装(Build_ext+Install)
问题描述
我正在学习如何使用distutils
,有些事情我不明白,希望有人能给我解释一下。
我已经成功创建了可以与
一起安装的tar.gz包pip install mypackage.tar.gz
我使用setup.py
实现了这一点,使用一个简单的脚本运行函数setuptools.setup()
,我使用python3 setup.py sdist
调用该函数。
我现在要了解的内容:如何在本文中包含生成扩展。
我的问题:我找不到任何全面的文本来解释具有build_ext
类的包的pip install
如何使其生成,然后安装。
如果我们查看this example,对于著名的工具cx_freeze
包,我们会看到:
- 有继承的
build_ext
类 - 有一种方法
build_extension()
- 在
setup()
中,变量cmdclass
,它包含一个包含类build_ext
的字典
build_ext
定义cmdclass
就足以实现这一点吗?
解决方案
经过多次测试,我了解到这与pip
的工作方式有关,而与setup.py
的工作方式无关。原来,在编写setup.py
文件并使用pip
进行安装后,会发生以下情况:
- pip创建一个临时文件,在Linux中位于
/tmp
中,在Windows中位于用户的temp目录中。 - pip将包下载/解压到该临时目录(从tar.gz、从在线资源或从存储库)
- pip按顺序运行以下操作:
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()
的列表,其中包含关于每个扩展的所有信息。类build_extension(self,ext)
中的函数将对该列表的每个元素执行。
所有这些转到cmdclass
(我使用build
和build_py
)的类都有一个名为run()
的方法,您应该重写该方法以放入自定义构建过程中。
完成所有操作后,pip将setup()
中定义的packages
(基本上是该临时中的目录)安装(或复制)到您的Python目录(即安装结束),并删除临时文件。
所有这些都有更多细节,但我想这对初学者来说是很好的。我在任何地方都看不到任何全面的解释。因此,我希望这能帮助人们,省去我学习这一点所必须进行的实证测试。
相关文章