Ошибка типа Django-admin: __init__() получил неожиданный аргумент ключевого слова ‘allow_abbrev’

#python #django #django-admin

#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'
  

Я использую Debian stretch, используя Python 3.5.3 и Django 2.1.4

Комментарии:

1. Вы решили эту проблему? У меня такая же проблема с Python 3.7.3 и обновлением с Django 2.0 до 2.1.13

2. Не совсем. Я обновился до 2.2.11, и, похоже, он исчез. Я также обновил Debian до buster.

Ответ №1:

TL; DR

Удалите argparse с помощью pip, затем действуйте как обычно. Pip устанавливает устаревшую версию argparse, предназначенную только для python < 3.2. Ее удаление позволяет использовать более новую версию argparse, входящую в состав стандартной библиотеки python (что вы и хотите).

Argparse часто можно установить через pip при установке более старого пакета, в котором argparse указан как зависимость (вы не хотите этого в современных версиях python).


У меня тоже была эта проблема, python 3.7.4 и оказалось, что argparse она была установлена в моей системе, через pip которую устанавливается полностью устаревшая версия argparse. Я полагаю, что это произошло, когда я установил пакет, который указан argparse в качестве одной из его зависимостей.

При дальнейшем исследовании версия pip устанавливается из старого репозитория github, где раньше происходила разработка argparse, прежде чем она была поглощена стандартной библиотекой python.

Предупреждение от самого репозитория:

Важное замечание о пакете PyPI argparse


разработка argparse в настоящее время происходит в стандартной библиотеке python, А НЕ ЗДЕСЬ.

Пакет PyPI argparse в основном предназначен для людей, которые хотят иметь argparse на старых Python, например < 2.7 или < 3.2, потому что тогда его не было в stdlib.

Таким образом, не отправляйте проблемы, запросы функций или запросы на извлечение для версии argparse для PyPI, если они также применяются к стандартной библиотеке argparse.

Если мы посмотрим на определение класса ArgumentParser в репозитории github / PyPI, мы увидим, что он не содержит определения для 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
  

Это указывает на то, что теперь я вызываю соответствующую («внутреннюю») версию argparse, поставляемую с python 3.7, что мы можем видеть из официального репозитория исходного кода python, который включает поддержку allow_abbrev . Мы также можем видеть из официального репозитория, что version 1.1 является подходящим номером версии для argparse, который поставляется с python 3.7.

После выполнения удаления я больше не получаю unexpected keyword argument 'allow_abbrev' ошибку, и все пакеты, которые полагаются на argparse, теперь функционируют как ожидалось.

В итоге

Pip устанавливает устаревшую версию argparse, которая вызывает эту ошибку. Установка argparse Pip часто может происходить за кулисами, если вы устанавливаете более старый пакет, в котором argparse указан как зависимость. Чтобы решить проблему, просто удалите argparse через pip, и python вернется к более новой, правильной версии argparse, которая входит в состав стандартной библиотеки.

Ответ №2:

Мы обнаружили, что это помогло удалить argparse из системы, используя pip uninstall argparse . Впоследствии мы установили argparse в нашей виртуальной среде, и по-прежнему никаких проблем. Я признаю, что не совсем понимаю, почему это помогло, поскольку версия argparse (1.4.0) осталась прежней. Мы используем Python 3.7.3.

Комментарии:

1. У меня тоже была эта проблема с Python 3.7.4 . Как ни странно, версия argparse, которую я установил (также 1.4.0 ), не соответствовала фактическому исходному коду python для python 3.7 , мой argparse.py не содержал никакого кода allow_abbrev .

2. Удалил argparse через pip, и теперь все работает. Оказывается, версия, которую устанавливает pip, невероятно устарела и не нужна, поскольку гораздо более новый argparse поставляется в комплекте с базовым python. Удаление версии pip позволяет python вернуться к обновленной предварительной версии. Смотрите Мой ответ для получения более подробной информации.

Ответ №3:

У меня была эта ошибка при обновлении приложения Elastic Beanstalk с помощью Django 2.1 (Python 3.6). Версия Django и зависимости были точно такими же, поэтому понятия не имею, почему появилась эта ошибка. Мы обнаружили, что проблема заключалась в том, что импортирующий argparse взял его из /opt/python/run/venv/local/lib/python3.6/site-packages/argparse.py , как если бы он был установлен извне.

Мы просто удалили этот файл, и все вернулось к норме. Если кто-то выяснит, почему это происходит, мне интересно.

Комментарии:

1. Спасибо за ваш ответ. Однако вместо удаления этого единственного файла я счел более чистым удаление argparse на системном уровне (см. Мой ответ).

2. Я думаю, я понял, что происходит. Короткий ответ: у вас был установлен argparse через pip, который устанавливает невероятно устаревшую версию. Удаление установки pip позволяет python вернуться к более новой версии argparse, которая теперь поставляется как часть стандартной библиотеки python. Смотрите Мой ответ для получения более подробной информации.

Ответ №4:

Я знаю, что это устарело, но я поделюсь своим методом, поскольку другие ответы не сработали для меня. pip не смог его удалить, но я мог видеть его путь, pip show argparse поэтому я просто удалил argparse.py откуда /usr/local/lib/python3.8/site-packages/ . В зависимости от вашей ОС и версии Python путь может немного отличаться.

Ответ №5:

allow_abbrev Параметр был введен argparse только начиная с Python 3.5, поэтому на самом деле вы не запускаете Django с версией Python 3.5 или более поздней. Вы должны настроить свою python3 команду так, чтобы она указывала на правильный двоичный файл Python версии 3.5 или более поздней.

Комментарии:

1. Когда я использую команду python3 -V, я получаю результат: Python 3.5.3 Есть ли какой-либо другой способ подтвердить, что я использую py 3.5 ?