Django-admin TypeError: __init__() 得到了一个意外的关键字参数“allow_abbrev”

Joh*_*hew 5 python django django-admin

我已将 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'
Run Code Online (Sandbox Code Playgroud)

我在使用 Python 3.5.3 和 Django 2.1.4 的 Debian 延伸

Col*_*ole 7

长话短说

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

当安装将 argparse 列为依赖项的旧包时,Argparse 通常可以通过 pip 安装(您不希望在现代版本的 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
Run Code Online (Sandbox Code Playgroud)

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

$ python -c 'import argparse; print(argparse.__version__)'
1.4.0
Run Code Online (Sandbox Code Playgroud)

通过卸载 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
Run Code Online (Sandbox Code Playgroud)

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

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

总之

Pip 安装了导致此错误的过时版本的 argparse。如果您安装将 argparse 列为依赖项的旧包,则通常会在幕后进行 Pip 安装 argparse。要解决这个问题,只需通过 pip 卸载 argparse,Python 将依赖于作为标准库的一部分包含的较新、正确的 argparse 版本。


blh*_*ing -1

allow_abbrev参数是从 Python 3.5 开始引入的argparse,因此您实际上并没有使用 3.5 或更高版本的 Python 版本运行 Django。您应该将python3命令配置为指向 3.5 或更高版本的正确 Python 二进制文件。