Чому 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

Відповіді:


230

Це тому, що ваш 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/enumне .../2.7/site-packages/enum34- просити неприємностей.)
denis

1
так, ти маєш рацію - це просто записка для кожного, хто намагається використати і те, і інше.
denis

9
У моєму випадку це дало мені Skipping enum34 as it is not installed.. Я використовую 3.7
Ротків

1
Що робити , якщо print(enum.__file__)дає мені це: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. Це означає, що я маю стандартну enum бібліотеку, а ні enum34? Редагувати: так, pip uninstall enum34дали меніSkipping enum34 as it is not installed.
Андрій

1
@ HåkenLid Це трапляється, коли я намагаюся відкрити a jupyter notebook.
Сінтія Г.С.

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 я перезапустив своє cmd-підказку. Це спрацювало, можливо, опосередковано він скинув PYTHONPATH
Karan Kaw

12

Для мене ця помилка сталася після встановлення компонента gcloud app-engine-python для інтеграції в pycharm. Видалення модуля допомогло, навіть якщо pycharm зараз не завантажується в систему-додаток.


4
Я отримав цю помилку під час запуску Flask під PyCharm і виправив її, відключивши підтримку AppEngine від проекту (Налаштування -> Мови та рамки -> Google App Engine). Виконання 2-го покоління для Python3 не використовує сервер розробників додатків, тому це має сенс (це для Python 2.x).
Бретт

9

Якщо хтось приїжджає сюди через отримання цієї помилки під час запуску програми Google Engine Engine Python 3.7 зі стандартним середовищем проекту в PyCharm, то все, що вам потрібно зробити, це

  • Переконайтеся, що конфігурація для запуску має Flask, а не конфігурацію Google App Engine.
  • Потім вимкніть підтримку Google App Engine у ​​розділі Налаштування >> Мови та рамки >> Google App Engine

Причина - за цим посиланням

Загальна мета полягає в тому, щоб ваш додаток було повністю портативним і працювало в будь-якому стандартному середовищі Python. Ви пишете стандартний додаток Python, а не додаток Python App Engine. У рамках цієї зміни вам більше не потрібно використовувати власні API та сервіси App Engine для основної роботи програми. Наразі API Engine 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 Standard App для стандартних додатків 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 Engine Engine" у налаштуваннях піхарми, виправлено цю проблему.

налаштування двигуна програми pycharm


Працює для мене. У мене був такий самий випуск, що запускається Flask в режимі налагодження з PyCharm
Khanh Hua

Це працює для мене. Тому що насправді google sdk використовує python2. ...
Хосе Мар

3

Відповідь Хекена Ліда допомогла вирішити мою проблему (спасибі!), В моєму випадку, присутній у 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'

Мій python(відноситься до python2), оскільки я частіше використовую python2.


Ця пропозиція не працює; все-таки отримати ту ж помилку.
Дерек

2

Коли колись у мене виникала ця проблема:

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

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

unset PYTHONPATH 

а потім запустити бажану команду, потім отримав успіх у цьому.


1
це так, тому що ваш PYTHONPATH повинен вказувати на речі, що належать до старої версії python, як це в моєму випадку. Він працював
Ніш

Старий VENV в моєму випадку. Thx для підказки :)
Janusz

2

Встановлення версії 1.1.8 enum34 працювало для мене.

Я зміг виправити це, додавши enum34 = "== 1.1.8" до pyproject.toml. Мабуть, enum34 мав особливість в v1.1.8, яка уникала цієї помилки, але ця регресія в v1.1.9 +. Це, однак, лише обхідне рішення. Кращим рішенням було б пакети використовувати маркери навколишнього середовища, тому вам зовсім не доведеться встановлювати enum34, якщо не потрібно.

Джерело: https://github.com/python-poetry/poetry/isissue/1122


1
Це рішення спрацювало для мене
Айфіт

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, коли викликається повторний модуль. Якщо я запускаю Python 3 і імпортую enum, а print(enum.__file__)система не показує цей шлях Python 2 до сайтів-пакунків. Отже, дуже грубий і брудний злом полягає в тому, щоб безпосередньо змінити модуль, в який імпортується перерахунок (дотримуйтесь контурів відстеження) і вставити наступний код безпосередньо перед імпортом enum:

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

Я сподіваюся, що пітон2 скоро помре! Тервейсін, Маркус


Це рішення може внести жахливий безлад у вашу систему! Ви повинні використовувати 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"
}
}

Тут ваш жорсткий код. Це рішення не буде працювати для новачків: будь ласка, поясніть, що це робить і де знайти відповідні файли.
Том Келлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.