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内置退出
-我的意思是交互调用不同的函数很奇怪。特别是考虑到每个选项在任何情况下都有效!