【问题标题】:SystemExit: 2 error when calling parse_args() within ipythonSystemExit:在 ipython 中调用 parse_args() 时出现 2 错误
【发布时间】:2017-07-04 03:35:16
【问题描述】:

我正在学习 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

%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

我该如何解决这个问题?

【问题讨论】:

  • 你不能在 ipython 中轻易地试验这个,因为在parse_args 中默认使用 ipython 命令行。尝试使用普通的 *.py 文件和 python 可执行文件来启动该文件。
  • argparse。它会帮助你,或者肯定会帮助别人
  • 我已经复制了你的代码,我没有发现任何问题。您是否在 .py 文件中尝试过,而不是其他方式?
  • 在 ipython 中,您可以将参数列表传递给解析器。来自 argparse 文档:parser.parse_args(['--sum', '7', '-1', '42'])parser.parse_args('--sum 7 -1 42'.split() )
  • 感谢你们立即帮助指出我的错误所在并提供替代方法,我尝试了不同的方法,但都是使用 ipython 而不是“正常”*.py

标签: python jupyter-notebook ipython argparse


【解决方案1】:

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 运行它,如图所示。

【讨论】:

  • 是的,它正是 ipython,只是想说我非常感谢您的明确回答!甚至我已经花了几个小时试图自己解决这个问题,看来我需要更多的时间来单独解决这个问题。谢谢。
【解决方案2】:

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

parser.add_argument('-f')

【讨论】:

  • 嘿,它工作了,但你能解释一下它是如何工作的吗?
  • Jupyter-Notebook 设置了一些默认参数。其中之一是“-f”。运行上述代码的 import sys sys.argv 将显示它们
【解决方案3】:

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

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

【讨论】:

【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 怎么可以不安装呢?这是一个标准库模块。
    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多