首页 > 解决方案 > Django-admin TypeError: __init__() 得到了一个意外的关键字参数“allow_abbrev”

问题描述

我已将 Django 升级到 2.1.4(从 2.0.5),当我运行命令行 manage.py 时出现以下错误 python3 manage.py createsuperuser

这是详细的错误:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 314, in execute
    parser = CommandParser(usage='%(prog)s subcommand [options] [args]', add_help=False, allow_abbrev=False)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/base.py", line 48, in __init__
    super().__init__(**kwargs)
TypeError: __init__() got an unexpected keyword argument 'allow_abbrev'

我在 Debian 上使用 Python 3.5.3 和 Django 2.1.4

标签: pythondjangodjango-admin

解决方案


TL;博士

使用 pip 卸载 argparse,然后照常进行。Pip 安装了一个过期版本的 argparse,仅适用于 python < 3.2。卸载它允许使用作为标准 python 库的一部分捆绑的较新版本的 argparse (这是你想要的)。

在安装将 argparse 列为依赖项的旧包时,通常可以通过 pip 安装 argparse(您不希望在现代版本的 python 上这样做)。


我也遇到了这个问题,python 3.7.4结果发现它argparse安装在我的系统上,通过pip它安装了一个完全过时的 argparse 版本。我相信这发生在我安装了一个列为argparse其依赖项之一的包时。

经过进一步调查,pip 版本是从旧的 github 存储库安装的,其中 argparse 开发在被吸收到标准 python 库之前曾经发生过。

来自回购本身的警告:

关于 PyPi argparse 包的重要说明


argparse 开发现在发生在 python 标准库中,而不是在这里。

PyPi argparse 包主要适用于希望在较旧的 Python 上使用 argparse 的人,例如 < 2.7 或 < 3.2,因为当时它不在 stdlib 中。

因此,如果 PyPi 版本的 argparse 也适用于标准库 argparse,则不要提交问题、功能请求或拉取请求。

如果我们查看github/PyPi 存储库中ArgumentParser 类的定义,allow_abbrev我们会发现它不包含.

此外,我们可以看到列出的版本在1.4.0 这里,以及一个注释"we use our own version number independant of the one in stdlib and we release this on pypi"


在我自己的(有问题的)安装中,我可以看到 argparse 被调用,就好像它是在外部安装的一样(即通过 pip)

$ python -c 'import argparse; print(argparse.__file__)'
/<stuff>/python3.7/lib/python3.7/site-packages/argparse-1.4.0-py3.7.egg/argparse.py

我们可以看到版本匹配通过 PyPi 分发的版本

$ python -c 'import argparse; print(argparse.__version__)'
1.4.0

通过卸载 argparse 后,pip uninstall argparse我现在得到:

$ python -c 'import argparse; print(argparse.__file__)'
/<stuff>/Python/3.7.4-foss-2018b/lib/python3.7/argparse.py

$ python -c 'import argparse; print(argparse.__version__)'
1.1

#Note: I have python installed under /<stuff>/Python/3.7.4-foss-2018b/bin/python

这表明我现在正在调用 python 3.7 附带的适当('内部')版本的 argparse,我们可以从官方 python 源代码库中看到它包括对allow_abbrev. 我们还可以从官方 repo 中看到,版本1.1是python 3.7 附带的 argparse的适当版本号。

执行卸载后,我不再收到unexpected keyword argument 'allow_abbrev'错误,并且任何依赖 argparse 的包现在都按预期运行。

总之

Pip 安装了导致此错误的过期版本的 argparse。如果您安装了一个将 argparse 列为依赖项的旧包,则 Pip 安装 argparse 通常会在幕后发生。要解决此问题,只需通过 pip 卸载 argparse,python 将使用标准库中包含的更新、正确版本的 argparse。


推荐阅读