用 argparse 杀死解释器
Posted
技术标签:
【中文标题】用 argparse 杀死解释器【英文标题】:Kill the interpreter with argparse 【发布时间】:2013-02-07 11:23:05 【问题描述】:我正在测试一些 argparse 代码。我想要一个可选参数,它从选择列表中收集n
的输入数量。所以,我写道:
import argparse
modules = ["geo", "loc"]
parser = argparse.ArgumentParser()
parser.add_argument("--modules", nargs='*', choices=modules)
有了这个设置,我可以可靠地完全杀死解释器。
如果你传递了一组有效的参数,它就可以正常工作:
>>> parser.parse_args("--module geo loc geo".split())
Namespace(modules=['geo', 'loc', 'geo'])
但是如果你传入一个未形成的参数,它会完全杀死 python:
>>> parser.parse_args("--module geo metro".split())
usage: [-h] [--modules [geo,loc [geo,loc ...]]]
: error: argument --modules: invalid choice: 'metro' (choose from 'geo', 'loc')
PS C:\Users\myname\mycode>
我的问题有两个:
-
这是预期的行为吗?如果是这样,这是什么原因?
我可以使用这段代码吗,因为我不介意我的程序是否会因格式错误的参数而死掉?或者有什么令人信服的理由来避免这种情况?
请注意,我在 Windows 7 上使用 Python2.7。
【问题讨论】:
parser_args
调用了一些 error
函数,该函数调用了 sys.exit
。这就是你得到这种行为的原因。
【参考方案1】:
是的,这是有意的,并记录在案:
在解析命令行时,parse_args() 会检查各种错误,包括不明确的选项、无效的类型、无效的选项、错误的位置参数个数等。遇到此类错误时,它会退出并打印错误连同使用信息:
这个想法是,如果用户给出了一个你不知道如何处理的无效选项或参数,最好的选择是放弃而不是事后猜测用户的实际意图。
如果你不介意,那应该没问题,对吧?除非您知道实现不同行为的原因,否则您的程序与所有平台上所有行为良好的命令行工具完全一致。
如果您确实想实现不同的行为,请捕获parse_args
可能引发的SystemExit
异常。
(我能想到的唯一与我刚才描述的方式不同的程序是版本控制工具 Git,它确实会尝试猜测用户的意思并打印出它的猜测。但它仍然会退出。)
【讨论】:
【参考方案2】:argparse
设计用于从命令行运行 Python 脚本时使用。这就是为什么无效的参数会导致程序退出。
这种行为几乎与所有 shell (bash/sh/dos/etc.) 实用程序一致。无效的命令行参数会导致程序退出并显示错误字符串和(可选)使用消息。
【讨论】:
以上是关于用 argparse 杀死解释器的主要内容,如果未能解决你的问题,请参考以下文章