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

问题描述 投票:0回答:8

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

我该如何解决这个问题?

python jupyter-notebook ipython argparse
8个回答
53
投票

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

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

您可以使用

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

所以问题是你试图从交互式解释器(看起来像 ipython)中使用

argparse
,此时程序已经启动,因此参数应该已经被解析。

要正确尝试它,请创建一个单独的 python 文件,例如

my_programme.py
并使用
python
从命令行运行它,如我所示。


38
投票

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

parser.add_argument('-f')

26
投票

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

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

10
投票

我很惊讶这里没有人提到这个答案如何修复 ipykernel_launcher.py: error: unrecognized argument in jupyter?

不需要

-f
论证。此外,
-f
技巧适用于 Jupyter,但不适用于 VS 代码。

tl;博士

使用

args, unknown = parser.parse_known_args()

而不是

args = parser.parse_args()

5
投票

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

尝试打印

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

尝试调用

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


1
投票

有两种方法可以解决这个问题:

  1. 使用

    get_ipython().__class__.__name__
    来确定我们是在ipython还是终端上运行,然后当我们在ipython上运行时使用
    parser.parse_args(args = [])

    try:
        get_ipython().__class__.__name__
        # No error means we're running on ipython
        args = parser.parse_args(args = []) # Reset args
    except NameError:
        # NameError means that we're running on terminal
        args = parser.parse_args()
    
  2. 使用

    parser.parse_known_args()
    单独存储现有参数。我们将得到一个具有两个值的元组的返回(第一个是由
    add_argument
    添加的参数,第二个是现有的参数)

    args = parser.parse_known_args()[0] # Allow unrecognized arguments
    

这两种方法的区别在于,第二种方法允许无法识别的参数。它将存储在返回元组的第二个值中。


0
投票

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


0
投票

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

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()给出错误。

© www.soinside.com 2019 - 2024. All rights reserved.