【问题标题】:How to pass setuptools command option from install to build command?如何将 setuptools 命令选项从安装传递到构建命令?
【发布时间】:2018-03-28 04:39:03
【问题描述】:

我有一个带有用户选项的自定义 build 命令:

class BuildCommand(distutils.command.build.build):

    user_options = [('foo', None, 'Foo')]

像这样添加:

setup(...
    cmdclass={"build": BuildCommand}
    ...)

如果我运行python setup.py build --foo,效果会很好。但是,build 在运行 installdevelop 时也会被调用,因此我希望这些命令具有相同的选项并将其传递给构建。我该怎么做?

【问题讨论】:

  • 如何设置foo的默认值?
  • 是的,但我想安装一个特定的给定值 --foo

标签: python setuptools


【解决方案1】:

我找到了两种方法来做到这一点(至少对于setuptools,没有尝试使用原始distutils),这两种方法我都不是特别喜欢,但它们似乎确实有效:

  1. 通过替换distclass来使用全局选项:

    class FooDistribution(setuptools.Distribution):
        global_options = setuptools.Distribution.global_options + [
            ('foo', None, 'Foo'),
            ]
    
        def __init__(self, attrs=None):
            self.foo = 0
            super().__init__(attrs)
    
    setup(
        ...
        distclass=FooDistribution,
        ...
    )
    

    然后您可以通过self.distribution.foo 从命令类访问它。选项需要在第一个命令之前在命令行中传递。

  2. 将选项添加到所有相关命令类并在构建类中使用set_undefined_options

    from distutils.command.build import build as build_orig
    from setuptools.command.install import install as install_orig
    from setuptools.command.develop import develop as develop_orig
    cmdclass = {}
    for super_class in [build_orig, install_orig, develop_orig]:
        class command(super_class):
            user_options = super_class.user_options + [
                ('foo', None, 'Foo'),
            ]
            def initialize_options(self):
                super().initialize_options()
                self.foo = None
    
        cmdclass[super_class.__name__] = command
    
    def run_build(self):
        print("self.foo: ", self.foo)
    
    def finalize_options_build(self):
        build_orig.finalize_options(self)
        for cmd in ['install', 'develop']:
            self.set_undefined_options(cmd,
                                       ('foo', 'foo'))
    
    cmdclass["build"].run = run_build
    cmdclass["build"].finalize_options = finalize_options_build
    
    setup(
        ...
        cmdclass=cmdclass
        ...
    )
    

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 2019-11-25
    • 2019-01-07
    • 2014-07-19
    相关资源
    最近更新 更多