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?

BryanWheelock
źródło
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.

Håken Lid
źródło
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

V. Singh
źródło
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.

mickmackk
źródło
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

Józef Abraham
źródło
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

dannypaz
źródło
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

chmoder
źródło
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
...
bandaangosta
źródło
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.

user3804602
źródło
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.

Gaurav
źródło
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

Josh Wolff
źródło
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"

Sidharth Rai
źródło
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.

bunkus
źródło
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.

Ezio
źródło
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

Markus Kaukonen
źródło
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.

emmmphd
źródło
-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"
}
}
dimitrijer
źródło
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,