Warum löst Python 3.6.1 AttributeError aus: Modul 'enum' hat kein Attribut 'IntFlag'?

119

Ich habe gerade Python 3.6.1 für MacOS X installiert

Wenn ich versuche, die Konsole auszuführen (oder etwas mit Python3 auszuführen), wird dieser Fehler ausgelöst:

  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'  

Die Klasse IntFlag existiert in enum.py. Warum wird der AttributeError ausgelöst?

BryanWheelock
quelle
8
Gibt es enum.pyzufällig einen Dateinamen in Ihrem Arbeitsverzeichnis?
juanpa.arrivillaga
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 ist im $ PATH
BryanWheelock
2
... das habe ich nicht gefragt. Ich fragte, ob * es eine Datei enum.pyin Ihrem Arbeitsverzeichnis gibt
juanpa.arrivillaga
4
Eigentlich war es so. "Stellen Sie sicher, dass PYTHONPATH nirgendwo in Ihren Shell-Konfigurationsdateien so eingestellt ist, dass es auf Ihre Python 2.7-Installation verweist."
juanpa.arrivillaga
2
Versuchen Sie, den Interpreter mit der -IOption auszuführen , Site-Pakete und Umgebungsvariablen zu ignorieren und / oder -vausführliche Nachrichten über Importe
anzuzeigen

Antworten:

227

Dies enumliegt daran, dass Sie nicht das Standardbibliotheksmodul sind enum. Sie haben wahrscheinlich das Paket enum34installiert.

Eine Möglichkeit, dies zu überprüfen, besteht darin, die Immobilie zu inspizieren enum.__file__

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

Seit Python 3.6 ist die enum34-Bibliothek nicht mehr mit der Standardbibliothek kompatibel. Die Bibliothek ist ebenfalls nicht erforderlich, sodass Sie sie einfach deinstallieren können.

pip uninstall -y enum34

Wenn Sie den Code benötigen, um auf Python-Versionen <= 3.4 und> 3.4 ausgeführt zu werden, können Sie versuchen, ihn enum-compatals Voraussetzung zu verwenden. Es wird nur enum34für ältere Python-Versionen ohne die Standardbibliotheksaufzählung installiert .

Håken Deckel
quelle
Das tötet ipython2 --> traitlets --> enum34. (Leider enum34ist in .../2.7/site-packages/enumnicht installiert .../2.7/site-packages/enum34- um Ärger bitten.)
Denis
1
Ja, Sie haben Recht - es ist nur eine Notiz für jeden, der versucht, beide zu verwenden.
Denis
9
In meinem Fall gab es mir Skipping enum34 as it is not installed.. Ich benutze 3.7
Rotkiv
1
Was ist, wenn print(enum.__file__)ich folgendes bekomme : /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. Bedeutet das, dass ich eine Standardbibliothek habe enum und nicht enum34? Edit: Ja, pip uninstall enum34gab mirSkipping enum34 as it is not installed.
Andrey
1
@ HåkenLid Das passiert übrigens, wenn ich versuche, ein zu öffnen jupyter notebook.
Cynthia GS
89

Ich bin mir nicht sicher, ob Sie dieses Problem noch haben. Ich hatte ein ähnliches Problem und konnte es einfach durch Deaktivieren behebenPYTHONPATH

$ unset PYTHONPATH

V. Singh
quelle
2
Nur zu Ihrer Information für PyCharm-Benutzer, um den PYTHONPATH zu deaktivieren, auf den ich geklickt habe Settings->Build, Execution, Deployment->Console->Python Console. Ich habe dann die Variable PYTHONPATH aus dem Feld mit dem Titel entfernt Environment variables. Hinweis: Zum Zeitpunkt dieses Schreibens habe ich PyCharm 2017.1.2 verwendet.
MikeyE
Dies funktioniert, aber ohne eine Kombination von Pfaden, die meine Python 2-Bibliotheken enthält, kann ich es zum Laufen bringen. Ich würde gerne wissen warum.
Ulf Aslak
Ja, in Windows habe ich meine cmd-Eingabeaufforderung neu gestartet. Es hat funktioniert. Vielleicht hat es indirekt PYTHONPATH
Karan Kaw
12

Bei mir trat dieser Fehler nach der Installation der gcloud-Komponente app-engine-python auf, um sie in pycharm zu integrieren. Die Deinstallation des Moduls hat geholfen, auch wenn pycharm jetzt nicht in die App-Engine hochgeladen wird.

mickmackk
quelle
4
Ich habe diesen Fehler beim Ausführen von Flask unter PyCharm erhalten und ihn behoben, indem ich die AppEngine-Unterstützung im Projekt deaktiviert habe (Einstellungen -> Sprachen und Frameworks -> Google App Engine). Die Laufzeit der 2. Generation für Python3 verwendet nicht den Entwicklungsserver der App-Engine, daher ist dies sinnvoll (für Python 2.x).
Brett
9

Wenn jemand hierher kommt, weil dieser Fehler beim Ausführen eines Python 3.7-Standardumgebungsprojekts der Google App Engine in PyCharm auftritt, müssen Sie nur noch etwas tun

  • Stellen Sie sicher, dass die auszuführende Konfiguration für Flask und nicht für die Google App Engine-Konfiguration gilt.
  • Deaktivieren Sie anschließend die Google App Engine-Unterstützung unter Einstellungen >> Sprachen und Framework >> Google App Engine

Der Grund ist wie unter diesem Link

Das übergeordnete Ziel ist, dass Ihre App vollständig portabel ist und in jeder Standard-Python-Umgebung ausgeführt werden kann. Sie schreiben eine Standard-Python-App, keine App Engine-Python-App. Im Rahmen dieser Verschiebung müssen Sie keine proprietären App Engine-APIs und -Dienste mehr für die Kernfunktionalität Ihrer App verwenden. Derzeit sind App Engine-APIs in der Python 3.7-Laufzeit nicht verfügbar.

Ich denke, wenn wir ein Python 3.7-Projekt in PyCharm als Google App Engine-Projekt erstellen, versucht es immer noch, dasselbe zu tun wie für eine Python2.7-App

Joseph Abraham
quelle
Wenn Sie also von Pycharm aus für Google App Engine schreiben, müssen Sie den Code manuell in die Cloud hochladen, oder kann Pycharm weiterhin in App Engine hochladen?
Ben
@Ben Ich bin mir nicht sicher, was Sie unter manuellem Hochladen von Code in die Cloud (Google App Engine) verstehen. Wenn Sie sich auf die Bereitstellung in App Engine beziehen, verwenden Sie den Befehl gcloud app deploy. Das hat nichts mit Pycharm zu tun.
Joseph Abraham
Ich bin nur ein Amateur, aber ich dachte, dass Sie durch Aktivieren der App Engine-Unterstützung in Pycharm einen Menübefehl zum Bereitstellen Ihres Codes verwenden können. Wenn Sie jedoch die App Engine-Unterstützung in Pycharm deaktivieren (dh Python 3.7 verwenden), müssen Sie zur Befehlszeile gehen, um Ihren Code bereitzustellen. Habe ich das Recht oder habe ich falsch interpretiert, wie die App-Engine unter 2.7 funktioniert hat?
Ben
@Ben Das liegt daran, dass die Unterstützungstools für die Pycharm-App-Engine auf Python 2.7 ausgerichtet sind. Wie ich in meiner Antwort erwähnt habe, betrachtet Google Python 3.7 Standard App Engine-Apps als Standard Python App. Und ich glaube, dies ist der Grund, warum sich Pycharm auch für Python 3.7 App Engine-Apps so verhält.
Joseph Abraham
8

HAFTUNGSAUSSCHLUSS: Bitte, @ juanpa.arrivillaga, wenn Sie diese Antwort sehen, können Sie gerne Ihre eigene schreiben und ich werde diesen Beitrag entfernen.

@ juanpa.arrivillaga hatte oben erwähnt :

Gibt es zufällig einen Dateinamen enum.py in Ihrem Arbeitsverzeichnis?

Dies war das Problem, auf das ich gestoßen bin. Ich kannte das Enum-Modul auf Python zu diesem Zeitpunkt nicht und hatte meine Testdatei benannt enum.py.

Da der Dateiname ist der Modulname, gab es einen Konflikt. Weitere Informationen zu Modulen finden Sie hier: https://docs.python.org/2/tutorial/modules.html

dannypaz
quelle
Du hast mein Leben gerettet.
Gastón
6

Das Deaktivieren von "Google App Engine Support" in den Pycharm-Einstellungen hat dieses Problem für mich behoben.

Pycharm App Engine Einstellungen

chmoder
quelle
Funktioniert bei mir. Ich hatte das gleiche Problem beim Ausführen von Flask im Debug-Modus von PyCharm
Khanh Hua
Das funktioniert bei mir. Weil eigentlich Google SDK Python2 verwendet. ...
Jose
3

Die Antwort von Håken Lid hat mir geholfen, mein Problem zu lösen (danke!), In meinem Fall in Python3.7, in dem Flask in einem Docker-Container ausgeführt wird ( FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7).

In meinem Fall enum34wurde von einer anderen Bibliothek installiert ( pip install smartsheet-python-sdk). Für diejenigen, die mit einem ähnlichen Docker-Container-Problem kommen, ist hier meine letzte Docker- Datei (auf die entsprechenden Zeilen reduziert):

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

Falls Sie PYTHONPATH sowohl für python2 als auch für python3 behalten müssen, können Sie Alias-Anweisungen schreiben, um den richtigen PYTHONPATH in Ihrem bash_profile festzulegen:

Codieren Sie Ihre Variablen PYTHONPATH2 und PYTHONPATH3 in Ihrem ~ / .bash_profile fest und fügen Sie am Ende die folgenden Aliase hinzu:

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

Mein python(bezieht sich auf Python2), da ich Python2 häufiger benutze.

user3804602
quelle
Dieser Vorschlag funktioniert nicht. bekomme immer noch den gleichen Fehler.
Derek
2

Wann immer ich dieses Problem bekam:

AttributeError: Modul 'enum' hat kein Attribut 'IntFlag'

einfach zuerst führe ich den Befehl aus:

unset PYTHONPATH 

und dann meinen gewünschten Befehl ausführen und dann Erfolg haben.

Gaurav
quelle
1
Dies ist so, weil Ihr PYTHONPATH auf Dinge verweisen muss, die zur alten Version von Python gehören, wie es in meinem Fall der Fall ist. Es funktionierte
nish
Stale VENV in meinem Fall. Danke für den Tipp :)
Janusz Skonieczny
2

Ich habe Folgendes verwendet: pip install <required-library> --ignore-installed enum34
Suchen Sie während der Erstellung nach Warnungen , sobald Ihre erforderliche Bibliothek installiert ist. Ich habe einen Fehler wie diesen erhalten:
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.

Um dieses Problem zu beheben, führen Sie jetzt den folgenden Befehl aus : pip freeze | grep enum34. Dadurch erhalten Sie die Version der installierten enum34. Deinstallieren Sie es jetzt mit pip uninstall enum34und installieren Sie die erforderliche Version als neu
pip install "enum34==1.1.20"

Sidharth Rai
quelle
1

Ich habe Python 2 und Python 3 auf meinem Computer installiert. Aus irgendeinem seltsamen Grund habe ich im sys.path von Python 3 auch einen Pfad zum Sitepackage-Bibliotheksverzeichnis von Python2, wenn das re-Modul aufgerufen wird. Wenn ich Python 3 ausführe und enum importiere und print(enum.__file__)das System diesen Python 2-Pfad zu Site-Paketen nicht anzeigt. Ein sehr grober und schmutziger Hack ist es also, das Modul, in das Enum importiert wird, direkt zu ändern (folgen Sie den Traceback-Pfaden) und den folgenden Code unmittelbar vor dem Import von Enum einzufügen:

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

Das hat mein Problem gelöst.

Bunkus
quelle
1

Die Installation von Version 1.1.8 von enum34 hat bei mir funktioniert.

Ich konnte dies beheben, indem ich pyproject.toml enum34 = "== 1.1.8" hinzufügte. Anscheinend hatte enum34 eine Funktion in Version 1.1.8, die diesen Fehler verhinderte, aber diese ging in Version 1.1.9 + zurück. Dies ist jedoch nur eine Problemumgehung. Die bessere Lösung wäre, wenn Pakete Umgebungsmarkierungen verwenden, sodass Sie enum34 nur installieren müssen, wenn dies erforderlich ist.

Quelle: https://github.com/python-poetry/poetry/issues/1122

Josh Wolff
quelle
1
Diese Lösung hat bei mir funktioniert
Ajith
0

Sogar ich hatte dieses Problem beim Ausführen von python -m grpc_tools.protoc --version Musste PYTHONPATH bis Site-Pakete setzen und alle Eingabeaufforderungsfenster herunterfahren und es funktionierte. Hoffe, es hilft für gRPC-Benutzer.

Ezio
quelle
0

Ich hatte dieses Problem in Ubuntu20.04 in Jupyterlab in meinem virtuellen Env-Kernel mit Python3.8 und Tensorflow 2.2.0. Fehlermeldung war

 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 war, dass in symbolischer Verknüpfung in / usr / bin / python auf python2 zeigte. Lösung:

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

Ich hoffe python2 wird bald sterben! Terveisin, Markus

Markus Kaukonen
quelle
Diese Lösung kann in Ihrem System schreckliche Probleme verursachen! Sie sollten virtualenv verwenden, anstatt das Standardpython für das gesamte System zu ändern.
Alex Baranowski
Vielen Dank für den Hinweis. Ich habe noch keine Probleme bemerkt (aber ich vermeide python2 immer so weit wie möglich). Python2-Liebhaber sollten dies definitiv nicht tun.
Markus Kaukonen
0

Wenn Sie dieses Problem haben , wenn laufende Tests in PyCharm, stellen Sie sicher , dass das zweite Feld ist nicht markiert in den Konfigurationen.

emmmphd
quelle
-2

Wenn jemand dieses Problem hat , wenn man versucht Jupyter Kernel von einem virtualenv zu laufen, fügen Sie einfach richtig PYTHONPATHzu kernel.jsonIhrem virtualenv Kernel (Python in Beispiel 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
quelle
Ihr Benutzerverzeichnis ist hier fest codiert. Diese Lösung funktioniert nicht für Anfänger: Bitte erläutern Sie, was sie tut und wo sich die entsprechenden Dateien befinden.
Tom Kelly