【发布时间】:2014-04-07 10:47:14
【问题描述】:
我正在编写一个我想使用 Setuptools 分发的脚本。我已将此脚本添加到我的setup.py 中的entry_points 部分。
来自 setuptools 文档:
您指定的函数在没有参数的情况下被调用,它们的返回值被传递给 sys.exit(),因此您可以返回错误级别或消息以打印到 stderr。
由于该方法将返回而不是退出,它变得更加可测试。出于可测试性的目的,我接受默认为sys.argv 的方法中的参数。到目前为止一切顺利。
将 argparse 添加到混合中时会出现问题。当 argparse 无法解析 args 时,它会调用 sys.exit。现在我真的希望 argparse 不这样做,因为这是由 setuptools 包装器处理的。我能想到解决这个问题的第一件事是覆盖argparse.ArgumentParser,但后来我看到了:
# ===============
# Exiting methods
# ===============
def exit(self, status=0, message=None):
if message:
self._print_message(message, _sys.stderr)
_sys.exit(status)
def error(self, message):
"""error(message: string)
Prints a usage message incorporating the message to stderr and
exits.
If you override this in a subclass, it should not return -- it
should either exit or raise an exception.
"""
self.print_usage(_sys.stderr)
self.exit(2, _('%s: error: %s\n') % (self.prog, message))
所以文档字符串声明我不应该返回并坚持引发异常。我该如何解决这个问题?
如果我解释得不够透彻的主要方法:
def main(args=sys.argv):
parser = ArgumentParser(prog='spam')
# parser is configured here
parsed = parser.parse_args(args)
# Parsed args are used here
【问题讨论】:
标签: python python-2.7 setuptools argparse