Python distutils`Command`如何返回非零退出代码?

Python distutils`Command`如何返回非零退出代码?,python,python-3.x,Python,Python 3.x,考虑最简单的python setup.py cmd: from distutils.core import Command, setup class Foo(Command): user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): pass setup(

考虑最简单的
python setup.py cmd

from distutils.core import Command, setup


class Foo(Command):
    user_options = []

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        pass

setup(
    cmdclass={'cmd': Foo}
)
它完全不起作用

但是,假设在我们什么也不做的情况下出现了问题,那么该命令应该如何向用户返回非零退出代码呢

返回值似乎被忽略;只说:

所有终端输出和文件系统交互都应由run()完成

这似乎是相关的,但没有特别的帮助

也许我们应该推断退出:

class Foo(Command):
    # ...
    def run(self):
        exit(1)
这当然有效

但我不清楚这样做是否正确:如果命令作为较长进程的一部分运行,或者它覆盖了一个内置命令,那么可能不会执行任何其他命令

相反,我们可以直接提出一个相关的异常,假设它更有可能得到很好的处理,但是当我们退出时,会有一个令人讨厌的回溯——如果我们自己已经记录了更好的东西呢

class Foo(Command):
    # ...
    def run(self):
        print('Oh noes!', file=sys.stderr)
        exit(1)

这样做安全吗;有更好的替代方案吗?

退出肯定会起作用,但如果出现错误消息希望停止执行,则会引发任何问题,这就是distutils如何在内部处理问题。例如,如果希望阻止setuptools提供的可编辑(开发)安装方法,仅使用
distutils
API,则可以通过提高
DistutilsError
来实现这一点

from setuptools.command.develop import develop 
from distutils.errors import DistutilsError

class fail_develop(develop):

    def run(self):
        raise DistutilsError('develop installation mode unsupported')

setup(
    ...
    cmdclass={'develop': fail_develop},
)
使用“开发”选项运行可能会导致以下情况:

running develop
error: develop installation mode unsupported

执行将停止,因为它被捕获,并且将引发
SystemExit
(现在,如果整个进程被其他一些Python库包装,这些Python库捕获了所有异常,包括
SystemExit
,或者其他一些进程期望非零退出代码,则可能会产生回溯或其他意外输出)。从表面上看,这与直接调用
SystemExit
(或调用
sys.exit
)没有太大区别,但对于自定义
发行版中可能出现的
distutilsetuperror
等错误,确实会生成前缀。这么说来,调用
sys.exit
就可以了。

引发异常?顺便说一句,不应以编程方式使用
exit()
,首选
sys.exit()
。看@cdarke-Huh,这很奇怪(我的意思是,为什么不
print
sys.print
然后..),干杯。我曾考虑过提出一个例外,但正如我在作品中所指出的,回溯可能不是我想要的(我会尽可能地“可能不是”),这是一个奇怪的现象,并不明显,而且你肯定不是唯一使用它的人。但是它不是
sys
,它的
\uuuuuuuuuuuu内置打印('hello')
(对于Python3)。@cdarke对,但它也是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu内置退出
-我的意思是交互调用不同的函数很奇怪。特别是考虑到每个选项在任何情况下都有效!