Почему Python 3.6.1 выдает AttributeError: модуль enum не имеет атрибута IntFlag?


119

Я только что установил Python 3.6.1 для MacOS X

Когда я пытаюсь запустить консоль (или запустить что-либо с Python3), выдается следующая ошибка:

  AttributeError: module 'enum' has no attribute 'IntFlag'

$ /Library/Frameworks/Python.framework/Versions/3.6/bin/python3  
Failed to import the site module  
Traceback (most recent call last):  
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 544, in <module>  
    main()  
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 530, in main  
    known_paths = addusersitepackages(known_paths)  
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 282, in addusersitepackages  
    user_site = getusersitepackages()  
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 258, in getusersitepackages  
    user_base = getuserbase() # this will also set USER_BASE  
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 248, in getuserbase  
    USER_BASE = get_config_var('userbase')  
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sysconfig.py", line 601, in get_config_var  
    return get_config_vars().get(name)  
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sysconfig.py", line 580, in get_config_vars  
    import _osx_support  
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_osx_support.py", line 4, in <module>  
    import re  
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/re.py", line 142, in <module>  
    class RegexFlag(enum.IntFlag):  
AttributeError: module 'enum' has no attribute 'IntFlag'  

Класс IntFlag существует в enum.py. Итак, почему выбрасывается AttributeError?


8
Есть ли enum.pyслучайно имя файла в вашем рабочем каталоге?
juanpa.arrivillaga

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 находится в $ PATH
BryanWheelock,

2
... я не об этом спросил. Я спросил, есть ли * enum.pyв вашем рабочем каталоге
juanpa.arrivillaga

4
Собственно, так и было. «Убедитесь, что нигде в ваших файлах конфигурации оболочки PYTHONPATH не указывает на вашу установку Python 2.7». Похоже, это вполне могло быть причиной этого.
juanpa.arrivillaga

2
Попробуйте запустить интерпретатор с -Iвозможностью игнорировать пакеты сайтов и переменную окружения и / или с, -vчтобы увидеть подробные сообщения об импорте
Ceppo93

Ответы:


231

Это потому, что ваш enumне является стандартным библиотечным enumмодулем. Вероятно, у вас enum34установлен пакет .

Один из способов проверить, так ли это, - осмотреть недвижимость. enum.__file__

import enum
print(enum.__file__)  
# standard library location should be something like 
# /usr/local/lib/python3.6/enum.py

Начиная с python 3.6 библиотека enum34 больше не совместима со стандартной библиотекой. Библиотека также не нужна, поэтому ее можно просто удалить.

pip uninstall -y enum34

Если вам нужен код для запуска на версиях python <= 3.4 и> 3.4, вы можете попробовать enum-compatустановить в качестве требования. Он устанавливается только enum34для более старых версий python без перечисления стандартной библиотеки.


Это убивает ipython2 --> traitlets --> enum34. (К сожалению, enum34установлен в .../2.7/site-packages/enumnot .../2.7/site-packages/enum34-
denis

1
да, вы правы - это просто на заметку всем, кто пытается использовать оба.
денис

9
В моем случае это дало мне Skipping enum34 as it is not installed.. Я использую 3,7
Rotkiv

1
Что делать , если print(enum.__file__)дает мне это: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. Значит ли это, что у меня есть стандартная enum библиотека, а нет enum34? Edit: да, pip uninstall enum34дал мнеSkipping enum34 as it is not installed.
Андрей

1
@ HåkenLid Это происходит, когда я, jupyter notebookкстати, пытаюсь открыть .
Cynthia GS

89

Не уверен, осталась ли у вас эта проблема. У меня была аналогичная проблема, и я смог решить ее, просто отключивPYTHONPATH

$ unset PYTHONPATH


2
Просто FYI для пользователей PyCharm, чтобы отключить PYTHONPATH, на который я нажал Settings->Build, Execution, Deployment->Console->Python Console. Затем я удалил переменную PYTHONPATH из поля с названием Environment variables. Примечание: на момент написания этой статьи я использовал PyCharm 2017.1.2.
MikeyE

Это работает, но без комбинации путей, включающих мои библиотеки Python 2, я могу заставить его работать. Я хотел бы знать почему.
Ульф Аслак

Да, в Windows я перезапустил командную строку, она сработала, возможно, косвенно он сбросил PYTHONPATH
Каран Кав

12

Для меня эта ошибка возникла после установки компонента gcloud app-engine-python для интеграции в pycharm. Удаление модуля помогло, даже если pycharm теперь не загружается в app-engine.


4
Я получил эту ошибку, запустив Flask под PyCharm, и исправил ее, отключив поддержку AppEngine в проекте (Настройки -> Языки и рамки -> Google App Engine). Среда выполнения 2-го поколения для Python3 не использует сервер разработки движка приложений, поэтому это имеет смысл (это для Python 2.x).
Brett

9

Если кто-то приходит сюда из-за этой ошибки при запуске проекта стандартной среды Python 3.7 для движка приложений Google в PyCharm, то все, что вам нужно сделать, это

  • Убедитесь, что запускаемая конфигурация предназначена для Flask, а не для конфигурации Google App Engine.
  • Затем отключите поддержку Google App Engine в разделе Preferences >> Languages ​​& Framework >> Google App Engine.

Причина в соответствии с этой ссылкой

Общая цель состоит в том, чтобы ваше приложение было полностью переносимым и работало в любой стандартной среде Python. Вы пишете стандартное приложение Python, а не приложение Python для App Engine. В рамках этого перехода вам больше не требуется использовать проприетарные API-интерфейсы и службы App Engine для основных функций вашего приложения. В настоящее время API-интерфейсы App Engine недоступны в среде выполнения Python 3.7.

Я думаю, когда мы создаем проект python 3.7 в PyCharm в качестве проекта движка приложений Google, он по-прежнему пытается делать то же самое, что и для приложения python2.7.


Итак, при написании для Google App Engine из Pycharm нужно ли вручную загружать свой код в облако или Pycharm все еще сможет загружать в App Engine?
Бен

@Ben Я не понимаю, что вы имеете в виду, когда вручную загружаете код в облако (Google App Engine). Если вы имеете в виду развертывание в App Engine, используйте команду gcloud app deploy. Это не имеет ничего общего с пичармом.
Джозеф Авраам

Я просто любитель в этом, но я думал, что включение поддержки App Engine в Pycharm дает вам возможность использовать команду меню для развертывания вашего кода. Но когда вы отключаете поддержку движка приложений в Pycharm (т. Е. Чтобы использовать Python 3.7), вам нужно перейти в командную строку для развертывания кода. Имею ли я это право, или я неверно истолковал работу движка приложения в версии 2.7?
Бен

@Ben Это потому, что инструменты поддержки движка приложений Pycharm нацелены на Python 2.7. Как я уже упоминал в своем ответе, Google считает приложения движка стандартных приложений Python 3.7 стандартным приложением Python. И я считаю, что именно по этой причине Pycharm ведет себя так же для приложений движка приложений Python 3.7.
Джозеф Авраам

8

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: @ juanpa.arrivillaga, если вы видите этот ответ, не стесняйтесь писать свой собственный, и я удалю этот пост.

@ juanpa.arrivillaga упомянул выше :

Есть ли случайно в вашем рабочем каталоге файл с именем enum.py?

Это была проблема, с которой я столкнулся. В то время я не знал о модуле enum на Python и назвал свой тестовый файл enum.py.

Поскольку имя файла является именем модуля, возник конфликт. Дополнительная информация о модулях здесь: https://docs.python.org/2/tutorial/modules.html


Ты спас мне жизнь.
Гастон,

6

Отключение «поддержки Google App Engine» в настройках pycharm устранило эту проблему для меня.

настройки движка приложений pycharm


Работает для меня. У меня была такая же проблема с запуском Flask в режиме отладки из PyCharm
Khanh Hua

У меня это работает. Поскольку на самом деле google sdk использует python2. ...
Хосе мар

3

Ответ Håken Lid помог решить мою проблему (спасибо!), В моем случае присутствовал в Python3.7, который запускает Flask в контейнере Docker ( FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7).

В моем случае enum34была установлена ​​другая библиотека ( pip install smartsheet-python-sdk). Для тех, кто сталкивается с аналогичной проблемой контейнера Docker, вот мой последний Dockerfile (вырезанный до соответствующих строк):

FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7
...
RUN pip install -r requirements.txt
RUN pip uninstall -y enum34
...

2

Если вам нужно сохранить PYTHONPATH как для python2, так и для python3, вы можете написать операторы псевдонима, чтобы установить правильный PYTHONPATH в вашем bash_profile:

Жестко закодируйте переменные PYTHONPATH2 и PYTHONPATH3 в вашем ~ / .bash_profile и добавьте в конец следующие псевдонимы:

alias python='export PYTHONPATH=${PYTHONPATH2};python'
alias python3='export PYTHONPATH=${PYTHONPATH3};python3'

My python(относится к python2), так как я чаще использую python2.


Это предложение не работает; по-прежнему получаю ту же ошибку.
Дерек

2

Когда у меня возникала эта проблема:

AttributeError: модуль enum не имеет атрибута IntFlag

просто сначала я запускаю команду:

unset PYTHONPATH 

а затем запустить желаемую команду и добиться в этом успеха.


1
это так, потому что ваш PYTHONPATH должен указывать на вещи, принадлежащие старой версии python, как в моем случае. Он работал
Ниш

В моем случае устаревший VENV. Спасибо за подсказку :)
Януш Сконечны 01

2

У меня сработала установка версии 1.1.8 enum34.

Я смог исправить это, добавив enum34 = "== 1.1.8" в pyproject.toml. По-видимому, в версии 1.1.8 в enum34 была функция, позволяющая избежать этой ошибки, но в версии 1.1.9 + она исчезла. Однако это всего лишь обходной путь. Лучшим решением было бы, чтобы пакеты использовали маркеры среды, поэтому вам вообще не нужно устанавливать enum34, если в этом нет необходимости.

Источник: https://github.com/python-poetry/poetry/issues/1122


1
Это решение сработало для меня при попытке использовать pyinstaller.
Джек Хейлз,

2

Я сделал это с помощью. pip install <required-library> --ignore-installed enum34
После установки необходимой библиотеки ищите предупреждения во время сборки. У меня такая ошибка:
Using legacy setup.py install for future, since package 'wheel' is not installed
ERROR: pyejabberd 0.2.11 has requirement enum34==1.1.2, but you'll have enum34 1.1.10 which is incompatible.

Чтобы устранить эту проблему в настоящее время выполнить команду: pip freeze | grep enum34. Это даст вам версию установленного enum34. Теперь удалите его pip uninstall enum34и переустановите требуемую версию как
pip install "enum34==1.1.20"


1

У меня на компьютере установлены Python 2 и Python 3. По какой-то странной причине у меня в sys.path Python 3 также есть путь к каталогу библиотеки sitepackage Python2, когда вызывается модуль re. Если я запускаю Python 3 и импортирую enum, и print(enum.__file__)система не показывает этот путь Python 2 к пакетам сайтов. Итак, очень грубый и грязный прием заключается в том, чтобы напрямую изменить модуль, в который импортируется перечисление (следуйте путям трассировки), и вставьте следующий код непосредственно перед импортом перечисления:

import sys
for i, p in enumerate(sys.path):
    if "python27" in p.lower() or "python2.7" in p.lower(): sys.path.pop(i)
import enum

Это решило мою проблему.


0

Даже у меня была эта проблема при запуске python -m grpc_tools.protoc --version Пришлось установить PYTHONPATH до пакетов сайта и закрыть все окна командной строки, и это сработало. Надеюсь, это поможет пользователям gRPC.


0

У меня была эта проблема в ubuntu20.04 в jupyterlab в моем виртуальном ядре env с python3.8 и tensorflow 2.2.0. Сообщение об ошибке было

 Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/hu-mka/.local/lib/python2.7/site-packages/ipykernel_launcher.py", line 15, in <module>
    from ipykernel import kernelapp as app
  File "/home/hu-mka/.local/lib/python2.7/site-packages/ipykernel/__init__.py", line 2, in <module>
    from .connect import *
  File "/home/hu-mka/.local/lib/python2.7/site-packages/ipykernel/connect.py", line 13, in <module>
    from IPython.core.profiledir import ProfileDir
  File "/home/hu-mka/.local/lib/python2.7/site-packages/IPython/__init__.py", line 48, in <module>
    from .core.application import Application
  File "/home/hu-mka/.local/lib/python2.7/site-packages/IPython/core/application.py", line 23, in <module>
    from traitlets.config.application import Application, catch_config_error
  File "/home/hu-mka/.local/lib/python2.7/site-packages/traitlets/__init__.py", line 1, in <module>
    from .traitlets import *
  File "/home/hu-mka/.local/lib/python2.7/site-packages/traitlets/traitlets.py", line 49, in <module>
    import enum
ImportError: No module named enum

Проблема заключалась в том, что символическая ссылка в / usr / bin / python указывала на python2. Решение:

cd /usr/bin/
sudo ln -sf python3 python

Я надеюсь, что python2 скоро умрет! Тервейсин, Маркус


Это решение может создать ужасный беспорядок в вашей системе! Вы должны использовать virtualenv вместо изменения Python по умолчанию для всей системы.
Алекс Барановски

Спасибо что подметил это. Я пока не заметил никаких проблем (но я всегда стараюсь избегать python2, насколько это возможно). Любители Python2 определенно не должны этого делать.
Маркус Кауконен,

0

Если вы с этой проблемой при запуске тестов в PyCharm, убедитесь , что второе окно является бесконтрольно в конфигурациях.


-2

Если у кого-то возникла эта проблема при попытке запустить ядро ​​Jupyter из virtualenv, просто добавьте исправления PYTHONPATHв kernel.jsonсвое ядро ​​virtualenv (в примере Python 3):

{
 "argv": [
  "/usr/local/Cellar/python/3.6.5/bin/python3.6",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3 (TensorFlow)",
 "language": "python",
 "env": {
     "PYTHONPATH":     "/Users/dimitrijer/git/mlai/.venv/lib/python3.6:/Users/dimitrijer/git/mlai/.venv/lib/python3.6/lib-dynload:/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6:/Users/dimitrijer/git/mlai/.venv/lib/python3.6/site-packages"
}
}

Здесь жестко запрограммирован ваш каталог пользователя. Это решение не подойдет новичкам: объясните, пожалуйста, что оно делает и где найти соответствующие файлы.
Tom Kelly
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.