Dlaczego Python 3.6.1 zgłasza błąd AttributeError: moduł „enum” nie ma atrybutu „IntFlag”?


119

Właśnie zainstalowałem Python 3.6.1 dla MacOS X

Kiedy próbuję uruchomić konsolę (lub cokolwiek uruchomić z Python3), pojawia się ten błąd:

  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'  

Klasa IntFlag istnieje w enum.py. Dlaczego więc wyrzucany jest błąd AttributeError?


8
Czy jest przypadkiem nazwa pliku enum.pyw twoim katalogu roboczym?
— juanpa.arrivillaga

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 znajduje się w $ PATH
— BryanWheelock

2
... nie o to prosiłem. Zapytałem, czy * jest plik o nazwieenum.py w twoim katalogu roboczym
— juanpa.arrivillaga

4
Właściwie to było. „Upewnij się, że nigdzie w plikach konfiguracyjnych powłoki PYTHONPATH nie wskazuje na instalację Pythona 2.7.” Wygląda na to, że może to być przyczyną.
— juanpa.arrivillaga

2
Spróbuj uruchomić interpreter z -Iopcją ignorowania pakietów witryn i zmiennych środowiskowych i / lub z, -vaby zobaczyć szczegółowe komunikaty o
— importach

Odpowiedzi:


230

To dlatego, że enumnie jest to standardowy enummoduł biblioteki . Prawdopodobnie masz enum34zainstalowany pakiet .

Jednym ze sposobów sprawdzenia, czy tak jest, jest inspekcja nieruchomości enum.__file__

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

Od Pythona 3.6 biblioteka enum34 nie jest już zgodna z biblioteką standardową. Biblioteka jest również niepotrzebna, więc możesz ją po prostu odinstalować.

pip uninstall -y enum34

Jeśli potrzebujesz kodu do działania w wersjach Pythona zarówno <= 3.4, jak i> 3.4, możesz spróbować enum-compat jako wymaganie. Instaluje się tylko enum34dla starszych wersji Pythona bez standardowej biblioteki wyliczenia.


To zabija ipython2 --> traitlets --> enum34. (Niestety enum34jest zainstalowany .../2.7/site-packages/enumnie .../2.7/site-packages/enum34- prosząc o kłopoty.)
— denis

1
tak, masz rację - to tylko uwaga dla każdego, kto próbuje użyć obu.
— denis

9
W moim przypadku dało mi to Skipping enum34 as it is not installed.. Używam 3.7
— Rotkiv

1
Co jeśli print(enum.__file__)mi daje to: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. Czy to znaczy, że mam standardową enum bibliotekę, a nie enum34? Edycja: tak, pip uninstall enum34dał miSkipping enum34 as it is not installed.
— Andrey

1
@ HåkenLid Dzieje się tak, gdy przy okazji próbuję otworzyć jupyter notebook.
— Cynthia GS

89

Nie jestem pewien, czy nadal masz ten problem. Miałem podobny problem i udało mi się go rozwiązać, po prostu wyłączającPYTHONPATH

$ unset PYTHONPATH


2
Po prostu do Twojej wiadomości dla użytkowników PyCharm, aby usunąć PYTHONPATH, na który kliknąłem Settings->Build, Execution, Deployment->Console->Python Console. Następnie usunąłem zmienną PYTHONPATH z pola o nazwie Environment variables. Uwaga: w czasie, gdy to piszę, korzystałem z PyCharm 2017.1.2.
— MikeyE

To działa, ale bez kombinacji ścieżek, które obejmują moje biblioteki Python 2, mogę to uruchomić. Chciałbym wiedzieć, dlaczego.
— Ulf Aslak

Tak, w systemie Windows ponownie uruchomiłem monit cmd, zadziałało, może pośrednio zresetowałem PYTHONPATH
— Karan Kaw

12

U mnie ten błąd wystąpił po zainstalowaniu komponentu gcloud app-engine-python w celu integracji z pycharm. Odinstalowanie modułu pomogło, nawet jeśli pycharm nie ładuje się teraz do silnika aplikacji.


4
Otrzymałem ten błąd podczas uruchamiania Flaska pod PyCharm i naprawiłem go, wyłączając obsługę AppEngine z projektu (Preferencje -> Języki i struktury -> Google App Engine). Środowisko uruchomieniowe drugiej generacji dla Python3 nie korzysta z serwera deweloperskiego silnika aplikacji, więc ma to sens (dotyczy Python 2.x).
— Brett

9

Jeśli ktoś przychodzi tutaj z powodu tego błędu podczas uruchamiania projektu środowiska standardowego środowiska Python 3.7 z silnikiem aplikacji Google w PyCharm, wszystko, co musisz zrobić, to

  • Upewnij się, że konfiguracja do uruchomienia dotyczy Flask, a nie konfiguracji Google App Engine.
  • Następnie wyłącz obsługę Google App Engine w Preferencjach >> Języki i struktura >> Google App Engine

Powodem jest ten link

Ogólnym celem jest to, aby Twoja aplikacja była w pełni przenośna i działała w dowolnym standardowym środowisku Pythona. Piszesz standardową aplikację w języku Python, a nie aplikację App Engine w języku Python. W ramach tej zmiany nie musisz już używać zastrzeżonych interfejsów API i usług App Engine do obsługi podstawowych funkcji aplikacji. W tej chwili interfejsy API App Engine nie są dostępne w środowisku wykonawczym Python 3.7.

Wydaje mi się, że kiedy tworzymy projekt w Pythonie 3.7 w PyCharm jako projekt silnika aplikacji Google, nadal próbuje zrobić to samo, co w przypadku aplikacji python2.7


Czy więc pisząc dla Google App Engine od Pycharm, trzeba ręcznie przesłać swój kod do chmury, czy Pycharm nadal będzie mógł przesłać go do App Engine?
— Ben

@Ben Nie jestem pewien, co masz na myśli, ręcznie przesyłając kod do chmury (Google App Engine). Jeśli odnosisz się do wdrażania w App Engine, użyj polecenia gcloud app deploy. To nie ma nic wspólnego z pycharmem.
— Joseph Abraham

Jestem w tym amatorem, ale pomyślałem, że włączenie obsługi App Engine w Pycharm daje możliwość użycia polecenia menu do wdrożenia kodu. Ale kiedy wyłączysz obsługę silnika aplikacji w Pycharm (tj. Aby używać Pythona 3.7), musisz przejść do wiersza poleceń, aby wdrożyć kod. Czy mam to prawo, czy też źle zinterpretowałem, jak działa silnik aplikacji w wersji 2.7?
— Ben

@Ben Dzieje się tak, ponieważ narzędzia obsługi silnika aplikacji Pycharm są przeznaczone dla języka Python 2.7. Jak wspomniałem w mojej odpowiedzi, Google traktuje aplikacje silnika aplikacji Python 3.7 Standard jako standardową aplikację Python. Uważam, że jest to powód, dla którego Pycharm również zachowuje się w ten sposób w przypadku aplikacji silnika aplikacji Python 3.7.
— Joseph Abraham,

8

ZRZECZENIE SIĘ: Proszę @ juanpa.arrivillaga, jeśli zobaczysz tę odpowiedź, napisz własną, a ja usunę ten post.

@ juanpa.arrivillaga wspomniał powyżej :

Czy jest przypadkiem nazwa pliku enum.py w twoim katalogu roboczym?

To był problem, który napotkałem. Nie znałem wtedy modułu enum w Pythonie i nazwałem mój plik testowyenum.py .

Ponieważ nazwa pliku to nazwa modułu, wystąpił konflikt. Więcej informacji o modułach tutaj: https://docs.python.org/2/tutorial/modules.html


Uratowałeś mi życie.
— Gastón

6

Wyłączenie „Google App Engine Support” w ustawieniach pycharm rozwiązało ten problem.

preferencje silnika aplikacji pycharm


Pracuje dla mnie. Miałem ten sam problem z uruchomieniem Flaska w trybie debugowania z PyCharm
— Khanh Hua

To działa dla mnie. Ponieważ faktycznie Google SDK używa python2. ...
— Jose Mar

3

Odpowiedź Håkena Lida pomogła rozwiązać mój problem (dzięki!), W moim przypadku obecny w Pythonie3.7 z uruchomionym Flaskiem w kontenerze Docker ( FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7).

W moim przypadku enum34był instalowany przez inną bibliotekę ( pip install smartsheet-python-sdk). Dla tych, którzy mają podobny problem z kontenerem Dockera , oto mój ostatni plik Dockerfile (rozebrany do odpowiednich wierszy):

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

2

W przypadku, gdy musisz zachować PYTHONPATH zarówno dla python2, jak i python3, możesz napisać instrukcje aliasu, aby ustawić właściwą PYTHONPATH w swoim bash_profile:

Zakoduj na stałe zmienne PYTHONPATH2 i PYTHONPATH3 w swoim ~ / .bash_profile i dodaj na końcu następujące aliasy:

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

My python(odnosi się do python2), ponieważ częściej używam python2.


Ta sugestia nie działa; nadal pojawia się ten sam błąd.
— Derek,

2

Kiedy kiedykolwiek miałem ten problem:

AttributeError: moduł „enum” nie ma atrybutu „IntFlag”

po prostu najpierw uruchamiam polecenie:

unset PYTHONPATH 

a następnie uruchom moje żądane polecenie i odniosłem sukces.


1
dzieje się tak, ponieważ Twoja PYTHONPATH musi wskazywać rzeczy należące do starej wersji Pythona, tak jak w moim przypadku. Udało się
— zakończ

Stale VENV w moim przypadku. Dzięki za napiwek :)
— Janusz Skonieczny

2

Zainstalowanie wersji 1.1.8 enum34 działało dla mnie.

Udało mi się to naprawić, dodając enum34 = "== 1.1.8" do pyproject.toml. Najwyraźniej enum34 miał funkcję w wersji 1.1.8, która pozwoliła uniknąć tego błędu, ale ta cofnęła się w wersji 1.1.9 +. Jest to jednak tylko obejście. Lepszym rozwiązaniem byłoby, gdyby pakiety używały znaczników środowiska, więc nie trzeba w ogóle instalować enum34, chyba że jest to konieczne.

Źródło: https://github.com/python-poetry/poetry/issues/1122


1
To rozwiązanie zadziałało dla mnie
— Ajith

1
To rozwiązanie zadziałało dla mnie, gdy próbowałem użyć pyinstaller.
— Jack Hales

2

Zrobiłem to za pomocą pip install <required-library> --ignore-installed enum34
Po zainstalowaniu wymaganej biblioteki poszukaj ostrzeżeń podczas kompilacji. Otrzymałem taki błąd:
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.

Aby rozwiązać ten problem teraz uruchomić komendę: pip freeze | grep enum34. W ten sposób otrzymasz wersję zainstalowanego pliku enum34. Teraz odinstaluj go pip uninstall enum34i zainstaluj ponownie wymaganą wersję jako
pip install "enum34==1.1.20"


1

Mam na komputerze zainstalowane Python 2 i Python 3. Z jakiegoś dziwnego powodu mam w sys.path Pythona 3 również ścieżkę do katalogu biblioteki pakietu witryny Python2, gdy wywoływany jest moduł re. Jeśli uruchomię Python 3 i zaimportuję enum, a print(enum.__file__)system nie wyświetla tej ścieżki Pythona 2 do pakietów witryn. Tak więc bardzo szorstki i brudny hack polega na bezpośrednim zmodyfikowaniu modułu, w którym importowane jest wyliczenie (postępuj zgodnie ze ścieżkami śledzenia) i wstawienie następującego kodu tuż przed zaimportowaniem wyliczenia:

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

To rozwiązało mój problem.


0

Nawet ja miałem ten problem podczas uruchamiania python -m grpc_tools.protoc --version Musiałem ustawić PYTHONPATH do pakietów witryn i zamknąć wszystkie okna wiersza polecenia i zadziałało. Mam nadzieję, że to pomaga użytkownikom gRPC.


0

Miałem ten problem w Ubuntu20.04 w jupyterlab w moim wirtualnym jądrze ENV z Python3.8 i tensorflow 2.2.0. Komunikat o błędzie to

 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

Problem polegał na tym, że w dowiązaniu symbolicznym w / usr / bin / python wskazywał na python2. Rozwiązanie:

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

Mam nadzieję, że python2 wkrótce umrze! Terveisin Markus


To rozwiązanie może narobić strasznego bałaganu w Twoim systemie! Powinieneś użyć virtualenv zamiast zmieniać domyślny Python dla całego systemu.
— Alex Baranowski

Dzięki za zwrócenie uwagi. Nie zauważyłem jeszcze żadnych problemów (ale zawsze unikam Pythona2 tak bardzo, jak to możliwe). Miłośnicy Pythona2 zdecydowanie nie powinni tego robić.
— Markus Kaukonen

0

Jeśli masz ten problem podczas uruchamiania testów w PyCharm, upewnij się, że drugie pole nie jest zaznaczone w konfiguracjach.


-2

Jeśli ktoś ma ten problem podczas próby uruchomienia jądra Jupyter z virtualenv, po prostu dodaj poprawne PYTHONPATHdo kernel.jsonjądra virtualenv (na przykład 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"
}
}

Twój katalog użytkownika jest tutaj zakodowany na stałe. To rozwiązanie nie będzie działać dla nowicjuszy: wyjaśnij, co robi i gdzie znaleźć odpowiednie pliki.
— Tom Kelly,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.