Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将setuptools命令选项从install传递到build命令?_Python_Setuptools - Fatal编程技术网

Python 如何将setuptools命令选项从install传递到build命令?

Python 如何将setuptools命令选项从install传递到build命令?,python,setuptools,Python,Setuptools,我有一个带有用户选项的自定义build命令: class BuildCommand(distutils.command.build.build): user_options = [('foo', None, 'Foo')] 添加如下内容: setup(... cmdclass={"build": BuildCommand} ...) 如果我运行python setup.py build--foo,它会工作得很好。但是,在运行install或develope时也会调用

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

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

    user_options = [('foo', None, 'Foo')]
添加如下内容:

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

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

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

  • 通过替换
    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
    从命令类访问它。在第一个命令之前,需要在命令行上传递选项

  • 将该选项添加到所有相关的命令类中,并在生成类中使用
    set\u undefined\u 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
        ...
    )
    

  • 设置
    foo
    的默认值如何?是的,但我希望使用一个特定的给定值--foo进行安装