在一个交互式运行的 python 会话中,我启动了我使用编写的模块/程序argparse
(因为这些模块也被用作来自 shell 提示符的命令)。
如果我使用错误的args
参数调用模块,argparse
则会按预期正确地吐出一个错误,但不幸的是arparse
随后调用sys.exit()
又终止了外部 python 会话。
那不是我想要的。如何在不更改sys.exit()
内部模块中的代码并且不将我的模块包装在代码中的情况下保护外部交互式 python 会话不被终止。- 我正在寻找可以设置的开关之类的东西,或者我可以在启动交互式 python 会话之前对其执行的操作,这样sys.exit()
就不会终止它。
从评论更新:
我问这个问题的原因是emacs的python模式(python.el):它有效地“粘贴”了python会话中模块文件的完整代码。如果我想将它包装在 a 中,try..except
我需要在包装它之前缩进整个模块并将其移交给 emacs 中的 python-session 缓冲区。
这是我使用的示例模块(我的大多数命令行实用程序都使用类似的模板):
#!/usr/bin/env python
"""\
tool to do stuff
"""
__author__ = """halloleo"""
__version__ = """0.1"""
import logging
import sys
import os
import clitools # my own helpers
#
# Options
#
def argParser(locArgs = None):
parser = clitools.HelpLogArgParser(description=__doc__)
parser.add_argument('files', metavar='FILE', nargs='+',
help='file to work on')
parser.add_loglevel_group()
return parser.parse_args(locArgs)
def doStuff(file)
# do stuff
print file
#
# main
#
if __name__ == '__main__':
args = argParser()
clitools.infoLoggerConfig(args.loglevel)
logging.debug("args = %s" % args)
for f in args.files
dostuff(f)
# Local Variables:
# leo-python-args-to-send: "--debug c:/tmp/testfile"
# End:
顺便说一句,我现在知道,这种方法有效。我已经实现了它,但是缩进整个模块代码有点吓人……这是我最后移交给 python 会话的内容:
import sys; sys.argv = '''scraper.py --debug c:/tmp/testfile'''.split()
try:
#!/usr/bin/env python
"""\
tool to do stuff
"""
.
.
.
# Local Variables:
# leo-python-args-to-send: "--debug c:/tmp/testfile"
# End:
except SystemExit, e:
print "Terminated with exit code", e