Python 3:setup.py:执行所有操作的 pip 安装(build_ext + 安装)
Python 3: setup.py: pip install that does everything (build_ext + install)
我正在学习如何使用 distutils
,有些地方我不明白,希望有人能向我解释一下。
我已经成功地创建了 tar.gz 可以安装的软件包
pip install mypackage.tar.gz
我用 setup.py
做了这个,用一个运行函数 setuptools.setup()
的简单脚本,我用 python3 setup.py sdist
.
调用它
我现在想学习的内容:如何在其中包含构建扩展。
我的问题: 我找不到任何全面的文字来解释 pip install
的包如何 build_ext
class 可以让它构建,然后安装。
如果我们查看 this example,对于著名的工具 cx_freeze
包,我们会看到:
- 有遗传
build_ext
class
- 有个方法
build_extension()
- 在
setup()
中,变量cmdclass
,其中包含一个包含classbuild_ext
的dict
我的问题:是什么让 cx_freeze
构建扩展然后安装它?用 build_ext
定义的 cmdclass
是否足以实现此目的?
经过多次测试,我了解到这与pip
的工作方式有关,而不是setup.py
的工作方式。事实证明,在编写 setup.py
文件并使用 pip
安装后,会发生以下情况:
- pip 创建一个临时文件,在 Linux 中它在
/tmp
中,在 Windows 中它在用户的临时目录中。
- pip downloads/extracts 包到该临时目录(无论是来自 tar.gz 还是来自在线资源或存储库)
- pip 运行s 按顺序进行以下操作:
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()
的列表,其中包含有关每个扩展名的所有信息。 class build_extension(self,ext)
中的函数将对该列表的每个元素执行。
所有这些转到 cmdclass
的 class(我使用 build
和 build_py
)都有一个名为 run()
的方法,您应该重写该方法输入您的自定义构建程序。
完成所有这些后,pip 安装(或复制)setup()
中定义的packages
(基本上是那个临时目录)到您的 Python 目录,这是安装的结尾,并删除临时文件。
关于这一切还有更多详细信息,但我想这对初学者来说还不错。我在任何地方都看到了 none 的全面解释。所以我希望这能帮助人们避免我为学习这个而必须做的实证测试。
我正在学习如何使用 distutils
,有些地方我不明白,希望有人能向我解释一下。
我已经成功地创建了 tar.gz 可以安装的软件包
pip install mypackage.tar.gz
我用 setup.py
做了这个,用一个运行函数 setuptools.setup()
的简单脚本,我用 python3 setup.py sdist
.
我现在想学习的内容:如何在其中包含构建扩展。
我的问题: 我找不到任何全面的文字来解释 pip install
的包如何 build_ext
class 可以让它构建,然后安装。
如果我们查看 this example,对于著名的工具 cx_freeze
包,我们会看到:
- 有遗传
build_ext
class - 有个方法
build_extension()
- 在
setup()
中,变量cmdclass
,其中包含一个包含classbuild_ext
的dict
我的问题:是什么让 cx_freeze
构建扩展然后安装它?用 build_ext
定义的 cmdclass
是否足以实现此目的?
经过多次测试,我了解到这与pip
的工作方式有关,而不是setup.py
的工作方式。事实证明,在编写 setup.py
文件并使用 pip
安装后,会发生以下情况:
- pip 创建一个临时文件,在 Linux 中它在
/tmp
中,在 Windows 中它在用户的临时目录中。 - pip downloads/extracts 包到该临时目录(无论是来自 tar.gz 还是来自在线资源或存储库)
- pip 运行s 按顺序进行以下操作:
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()
的列表,其中包含有关每个扩展名的所有信息。 class build_extension(self,ext)
中的函数将对该列表的每个元素执行。
所有这些转到 cmdclass
的 class(我使用 build
和 build_py
)都有一个名为 run()
的方法,您应该重写该方法输入您的自定义构建程序。
完成所有这些后,pip 安装(或复制)setup()
中定义的packages
(基本上是那个临时目录)到您的 Python 目录,这是安装的结尾,并删除临时文件。
关于这一切还有更多详细信息,但我想这对初学者来说还不错。我在任何地方都看到了 none 的全面解释。所以我希望这能帮助人们避免我为学习这个而必须做的实证测试。