首页 > 解决方案 > setup.py 中的代码仅在构建期间被调用?还是在安装过程中?

问题描述

要构建包分发,我们使用以下命令调用 setup.py 文件:

python3 setup.py sdist,然后, setup.py 中的代码被调用并创建分发。

现在有两种安装方式:

  1. pip install ./dist/SomeProject-1.0.4.tar.gz

  2. 点安装。

setup.py 文件是否在安装过程中同时使用上述两种方法被调用?(我在 setup.py 文件中添加了打印语句,并注意到它在构建期间显示但在安装期间不显示)

但是文档说“设置脚本通常非常简单,尽管因为它是用 Python 编写的,所以你可以用它做的事情没有任意限制,尽管你应该小心在设置脚本中放置任意昂贵的操作。不像,比如说,Autoconf 风格的配置脚本,设置脚本可能会在构建和安装模块分发的过程中运行多次。https://docs.python.org/3/distutils/introduction.html#a-simple-例子

我只想在构建期间而不是在安装期间在 setup.py 文件中运行一些自定义代码。这可能吗?

标签: pythonpython-3.xpipsetuptoolspython-packaging

解决方案


setup.py 中的代码仅在构建期间被调用?还是在安装过程中?

这取决于...

如果您使用setuptools安装项目(setup.py installeasy_install),那么您setup.py很可能在安装时运行。如果您使用pip安装它,那么您setup.py很可能不会在安装时运行。

您应该将自定义步骤限制为您可以控制的构建操作。一旦您发布了项目的发行版,您几乎无法控制到底发生了什么。

我只想在构建期间而不是在安装期间在 setup.py 文件中运行一些自定义代码。这可能吗?

是的。您需要自定义相应的命令。

下面是一个示例,展示了如何创建一个新的自定义build_something命令,该命令也作为默认build命令的子命令添加:

#!/usr/bin/env python3

import distutils.command.build
import setuptools

class build_something(setuptools.Command):
    user_options = []
    def initialize_options(self):
        pass
    def finalize_options(self):
        pass
    def run(self):
        print(" *** build_something ***")

class build(distutils.command.build.build):
    _sub_command = (
        'build_something',
        None,
    )
    _sub_commands = distutils.command.build.build.sub_commands
    sub_commands = [_sub_command] + _sub_commands

setuptools.setup(
    name='Thing',
    version='0.0.0',
    cmdclass={
        'build_something': build_something,
        'build': build,
    },
)

推荐阅读