gpt4 book ai didi

python - 当被调用的模块/程序发出 sys.exit() 时如何保护 python 解释器不被终止

转载 作者:行者123 更新时间:2023-11-28 21:22:10 25 4
gpt4 key购买 nike

交互式 运行的 python session 中,我启动了我使用 argparse 编写的模块/程序(因为这些模块也可以用作 shell 提示符下的命令)。

如果我用错误的 args 参数调用模块,argparse 会按预期正确吐出错误,但不幸的是 arparse 然后调用 sys.exit() 依次终止外部 python session 。

这不是我想要的。如何在不更改内部模块中的 sys.exit() 代码并且不将我的模块包装在代码中的情况下保护外部交互式 python session 不被终止。 - 我正在寻找类似我可以设置的开关或我可以在启动交互式 python session 之前对其执行的操作,以便 sys.exit() 不会终止它。

评论更新:

我问这个问题的原因是 emacs 的 python 模式(python.el):它有效地将模块文件的完整代码“粘贴”到 python session 中。如果我想将其包装在 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 session 的内容:

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

最佳答案

使用 try/except block捕获 SystemExit。例如:

import sys

try:
sys.exit()
except SystemExit:
print "Tried to sys.exit()"

关于python - 当被调用的模块/程序发出 sys.exit() 时如何保护 python 解释器不被终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19804254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com