用 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 杀死解释器的主要内容,如果未能解决你的问题,请参考以下文章

python argparse库的解释与应用

linux kill杀死进程

从终端杀死linux中的python解释器

如何使用在后端执行的长时间运行的 C/C++ 代码杀死 python 解释器?

docopt——好用的Python命令行参数解释器

python开发简单的命令行工具