我正在学习 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
,此时程序已经启动,因此参数应该已经被解析。
要正确尝试它,请创建一个单独的 python 文件,例如
my_programme.py
并使用 python
从命令行运行它,如我所示。
[快速解决方案] 在代码中添加一个虚拟解析器参数
parser.add_argument('-f')
遇到过类似的问题。添加这些行解决了我的问题。
import sys
sys.argv=['']
del sys
我很惊讶这里没有人提到这个答案如何修复 ipykernel_launcher.py: error: unrecognized argument in jupyter?
不需要
-f
论证。此外,-f
技巧适用于 Jupyter,但不适用于 VS 代码。
tl;博士
使用
args, unknown = parser.parse_known_args()
而不是
args = parser.parse_args()
parse_args
方法,当不带参数调用时,会尝试解析 sys.argv
的内容。您的解释器进程在 sys.argv
中填充了与您的 parser
实例支持的参数不匹配的值,这就是解析失败的原因。
尝试打印
sys.argv
以检查传递给解释器进程的参数。
尝试调用
parser.parse_args(['my', 'list', 'of', 'strings'])
以查看解析器如何为使用不同命令行参数启动的解释器工作。
有两种方法可以解决这个问题:
使用
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()
使用
parser.parse_known_args()
单独存储现有参数。我们将得到一个具有两个值的元组的返回(第一个是由 add_argument
添加的参数,第二个是现有的参数)
args = parser.parse_known_args()[0] # Allow unrecognized arguments
这两种方法的区别在于,第二种方法允许无法识别的参数。它将存储在返回元组的第二个值中。
我知道这个问题已经有近三年的历史了,但尽管听起来很愚蠢,当您没有安装 argparse 时也会产生此退出错误,而不是默认的“找不到此模块”错误消息。只是帮助可能也有此错误的人。
添加参数并分配一些值是可行的。我将 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()给出错误。