SystemExit:在 ipython 中调用 parse_args() 时出现 2 错误

SystemExit: 2 error when calling parse_args() within ipython

我正在学习 Python 的基础知识,并且已经卡在了 argparse 教程的开头。我收到以下错误:

import argparse
parser = argparse.ArgumentParser()
args = parser.parse_args()
usage: __main__.py [-h] echo
__main__.py: error: unrecognized arguments: -f
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

a %tb 命令给出以下输出:

SystemExit                                Traceback (most recent call last)
<ipython-input-16-843cc484f12f> in <module>()
----> 1 args = parser.parse_args()

C:\Users\Haik\Anaconda2\lib\argparse.pyc in parse_args(self, args, namespace)
   1702         if argv:
   1703             msg = _('unrecognized arguments: %s')
-> 1704             self.error(msg % ' '.join(argv))
   1705         return args
   1706 

C:\Users\Haik\Anaconda2\lib\argparse.pyc in error(self, message)
   2372         """
   2373         self.print_usage(_sys.stderr)
-> 2374         self.exit(2, _('%s: error: %s\n') % (self.prog, message))

C:\Users\Haik\Anaconda2\lib\argparse.pyc in exit(self, status, message)
   2360         if message:
   2361             self._print_message(message, _sys.stderr)
-> 2362         _sys.exit(status)
   2363 
   2364     def error(self, message):

SystemExit: 2

我该如何解决这个问题?

argparse 是一个模块,用于解析从 命令行 传递的参数,例如,如果您在命令提示符下键入以下内容:

$ python my_programme.py --arg1=5 --arg2=7

可以用argparse来解释--arg1=5 --arg2=7部分。如果 argparse 认为参数无效,它会退出,这通常在 python 中通过调用 sys.exit() 来完成,这会引发 SystemExit 错误,这就是您所看到的.

所以问题是你正在尝试从交互式解释器(看起来像 ipython)使用 argparse,此时程序已经启动,所以 args 应该已经已解析。

要尝试正确地创建一个单独的 python 文件,例如 my_programme.py 和 运行 它使用 python 来自命令行,如我所示。

parse_args 方法,当它在没有参数的情况下被调用时,会尝试解析 sys.argv 的内容。您的解释器进程填充 sys.argv 的值与您的 parser 实例支持的参数不匹配,这就是解析失败的原因。

尝试打印 sys.argv 以检查传递给解释器进程的参数。

尝试调用 parser.parse_args(['my', 'list', 'of', 'strings']) 以查看解析器如何为使用不同的 cmdline 参数启动的解释器工作。

[快速解决方案]在代码中添加一个虚拟解析器参数

parser.add_argument('-f')

我知道这个问题已有将近三年的历史,但听起来很愚蠢,当您没有安装 argparse 时也会产生此退出错误,而不是默认的“找不到此模块”错误信息。只是帮助可能也有此错误的人。

运行 遇到过类似的问题。添加这些行解决了我的问题。

import sys
sys.argv=['']
del sys

添加参数并分配一些值有效。我将 args(ArgumentParser 类型对象)从一个函数传递到另一个函数(不是典型情况,例如从终端获取用户 args)。

from argparse import ArgumentParser
parser = ArgumentParser()
# create and assign a dummy args
parser.add_argument('--myarg1')
args = parser.parse_args(['--myarg1', ''])

args.myarg2 = True  # actuals args assignment
myTargetFunction(args)  # passing args to another function  

我发现解析器中没有任何实际参数,parse_args() 给出错误。