Perché Python 3.6.1 lancia AttributeError: il modulo 'enum' non ha l'attributo 'IntFlag'?


119

Ho appena installato Python 3.6.1 per MacOS X

Quando tento di eseguire la console (o eseguire qualsiasi cosa con Python3), viene generato questo errore:

  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'  

La classe IntFlag esiste in enum.py. Allora, perché viene lanciato AttributeError?


8
C'è un nome di file enum.pynella tua directory di lavoro, per caso?
juanpa.arrivillaga

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 è in $ PATH
BryanWheelock

2
... non è quello che ho chiesto. Ho chiesto se * c'era un file denominato enum.pynella tua directory di lavoro
juanpa.arrivillaga

4
In realtà lo era. "Assicurati che da nessuna parte nei tuoi file di configurazione della shell, PYTHONPATH sia impostato per puntare alla tua installazione di Python 2.7." Sembra che la causa sia molto buona.
juanpa.arrivillaga

2
Prova a eseguire l'interprete con l' -Iopzione per ignorare i pacchetti del sito e la variabile d'ambiente e / o con -vper vedere messaggi dettagliati sulle importazioni
Ceppo93

Risposte:


230

È perché il tuo enumnon è il enummodulo della libreria standard . Probabilmente hai il pacchetto enum34installato.

Un modo per verificare se questo è il caso è ispezionare la proprietà enum.__file__

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

A partire da python 3.6 la libreria enum34 non è più compatibile con la libreria standard. Anche la libreria non è necessaria, quindi puoi semplicemente disinstallarla.

pip uninstall -y enum34

Se hai bisogno del codice per funzionare su versioni di python sia <= 3.4 che> 3.4, puoi provare ad averlo enum-compatcome requisito. Si installa solo enum34per le versioni precedenti di python senza la libreria standard enum.


Questo uccide ipython2 --> traitlets --> enum34. (Purtroppo, enum34è installato in .../2.7/site-packages/enumnon .../2.7/site-packages/enum34- chiedendo guai.)
denis

1
sì hai ragione - è solo una nota per chiunque tenti di usarli entrambi.
denis

9
Nel mio caso mi ha dato Skipping enum34 as it is not installed.. Sto usando 3.7
Rotkiv

1
E se print(enum.__file__)mi dà questo: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. Significa che ho una enum libreria standard e non enum34? Modifica: sì, pip uninstall enum34mi ha datoSkipping enum34 as it is not installed.
Andrey il

1
@ HåkenLid Questo succede quando provo ad aprire un jupyter notebooka proposito.
Cynthia GS

89

Non sono sicuro che tu abbia ancora questo problema. Ho avuto un problema simile e sono stato in grado di risolverlo semplicemente disinserendoPYTHONPATH

$ unset PYTHONPATH


2
Cordiali saluti per gli utenti di PyCharm, per annullare l'impostazione del PYTHONPATH su cui ho fatto clic Settings->Build, Execution, Deployment->Console->Python Console. Ho quindi rimosso la variabile PYTHONPATH dal campo intitolato Environment variables. Nota: al momento della stesura di questo articolo, stavo utilizzando PyCharm 2017.1.2.
MikeyE

Funziona, ma senza una combinazione di percorsi che include le mie librerie Python 2 posso farlo funzionare. Mi piacerebbe sapere perché.
Ulf Aslak

Sì, in Windows, ho riavviato il prompt di cmd, ha funzionato, forse indirettamente ha ripristinato PYTHONPATH
Karan Kaw

12

Per me questo errore si è verificato dopo l'installazione del componente gcloud app-engine-python per integrarlo in pycharm. La disinstallazione del modulo ha aiutato, anche se pycharm ora non si carica su app-engine.


4
Ho ricevuto questo errore eseguendo Flask sotto PyCharm e l'ho risolto disabilitando il supporto AppEngine dal progetto (Preferenze -> Lingue e framework -> Google App Engine). Il runtime di seconda generazione per Python3 non utilizza il server di sviluppo del motore di app, quindi ha senso (è per Python 2.x).
Brett

9

Se qualcuno viene qui a causa di questo errore durante l'esecuzione di un progetto di ambiente standard Python 3.7 del motore dell'app Google in PyCharm, tutto ciò che devi fare è

  • Assicurati che la configurazione da eseguire sia per Flask, non per la configurazione di Google App Engine.
  • Quindi disabilita il supporto di Google App Engine in Preferenze >> Lingue e Framework >> Google App Engine

Il motivo è come da questo collegamento

L'obiettivo generale è che la tua app sia completamente portabile ed eseguita in qualsiasi ambiente Python standard. Scrivi un'app Python standard, non un'app Python di App Engine. Nell'ambito di questo passaggio, non è più necessario utilizzare API e servizi proprietari di App Engine per le funzionalità principali della tua app. Al momento, le API di App Engine non sono disponibili nel runtime di Python 3.7.

Immagino che quando creiamo un progetto python 3.7 in PyCharm come progetto del motore di app di Google, provi ancora a fare lo stesso modo in cui fa per un'app python2.7


Quindi, quando si scrive per Google App Engine da Pycharm, è necessario caricare manualmente il proprio codice sul cloud o Pycharm sarà ancora in grado di caricare su App Engine?
Ben

@ Ben non sono sicuro di cosa intendi con il caricamento manuale del codice nel cloud (Google App Engine). Se ti riferisci alla distribuzione su App Engine, utilizza il comando gcloud app deploy. Non ha niente a che fare con pycharm.
Joseph Abraham

Sono solo un dilettante in questo, ma pensavo che abilitare il supporto di App Engine in Pycharm ti desse la possibilità di utilizzare un comando di menu per distribuire il tuo codice. Tuttavia, quando disabiliti il ​​supporto del motore di app in Pycharm (ovvero per utilizzare Python 3.7), devi andare alla riga di comando per distribuire il codice. Ho questo diritto o ho interpretato male come funzionavano le cose del motore dell'app con la versione 2.7?
Ben

@Ben Questo perché gli strumenti di supporto del motore di app Pycharm sono destinati a Python 2.7. Come ho accennato nella mia risposta, Google considera le app del motore di app standard Python 3.7 come app Python standard. E credo che questo sia il motivo per cui anche Pycharm si comporta in questo modo per le app del motore di app Python 3.7.
Joseph Abraham il

8

DISCLAIMER: Per favore, @ juanpa.arrivillaga, se vedi questa risposta, sentiti libero di scrivere la tua e rimuoverò questo post.

@ juanpa.arrivillaga aveva menzionato sopra :

C'è un nome di file enum.py nella tua directory di lavoro, per caso?

Questo è stato il problema che ho riscontrato. All'epoca non ero a conoscenza del modulo enum su Python e avevo chiamato il mio file di test enum.py.

Dal momento che il nome del file è il del modulo, si è verificato un conflitto. Maggiori informazioni sui moduli qui: https://docs.python.org/2/tutorial/modules.html


Mi hai salvato la vita.
Gastón

6

La disattivazione di "Supporto di Google App Engine" nelle preferenze di pycharm ha risolto questo problema per me.

preferenze del motore dell'app pycharm


Per me va bene. Ho avuto lo stesso problema eseguendo Flask in modalità debug da PyCharm
Khanh Hua

Questo funziona per me. Perché in realtà google sdk utilizza python2. ...
Jose Mar

3

La risposta di Håken Lid ha aiutato a risolvere il mio problema (grazie!), Nel mio caso presente in Python3.7 con Flask in esecuzione in un contenitore Docker ( FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7).

Nel mio caso, enum34veniva installato da un'altra libreria ( pip install smartsheet-python-sdk). Per coloro che hanno un problema simile al container Docker, ecco il mio Dockerfile finale (ridotto alle righe pertinenti):

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

2

Nel caso in cui devi mantenere PYTHONPATH sia per python2 che per python3, puoi scrivere istruzioni alias per impostare il PYTHONPATH corretto nel tuo bash_profile:

Codifica le tue variabili PYTHONPATH2 e PYTHONPATH3 nel tuo ~ / .bash_profile e aggiungi i seguenti alias alla fine:

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

My python(si riferisce a python2) poiché uso python2 più spesso.


Questo suggerimento non funziona; ricevo ancora lo stesso errore.
Derek

2

Quando mai ho avuto questo problema:

AttributeError: il modulo "enum" non ha l'attributo "IntFlag"

semplicemente prima eseguo il comando:

unset PYTHONPATH 

e poi esegui il mio comando desiderato, quindi ho avuto successo.


1
questo è così perché il tuo PYTHONPATH deve puntare a cose che appartengono alla vecchia versione di python, come nel mio caso. Ha funzionato
nish il

VENV stantio nel mio caso. Grazie per la punta :)
Janusz Skonieczny

2

L'installazione della versione 1.1.8 di enum34 ha funzionato per me.

Sono stato in grado di risolvere questo problema aggiungendo enum34 = "== 1.1.8" a pyproject.toml. Apparentemente enum34 aveva una funzionalità nella v1.1.8 che evitava questo errore, ma regrediva nella v1.1.9 +. Questa è solo una soluzione alternativa. La soluzione migliore sarebbe che i pacchetti utilizzassero i marcatori di ambiente in modo da non dover installare enum34 a meno che non sia necessario.

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


1
Questa soluzione ha funzionato per me
Ajith

1
Questa soluzione ha funzionato per me, quando ho provato a utilizzare pyinstaller.
Jack Hales

2

L'ho fatto usando pip install <required-library> --ignore-installed enum34
Una volta installata la libreria richiesta, cerca gli avvisi durante la compilazione. Ho ricevuto un errore come questo:
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.

Per risolvere questo problema ora eseguire il comando: pip freeze | grep enum34. Questo ti darà la versione dell'enum34 installato. Ora disinstallalo pip uninstall enum34e reinstalla la versione richiesta come
pip install "enum34==1.1.20"


1

Ho Python 2 e Python 3 installati sul mio computer. Per qualche strana ragione ho nel sys.path di Python 3 anche un percorso alla directory della libreria del pacchetto del sito di Python2 quando viene chiamato il modulo re. Se eseguo Python 3 e importi enum e print(enum.__file__)il sistema non mostra questo percorso Python 2 per i pacchetti del sito. Quindi un trucco molto approssimativo e sporco è modificare direttamente il modulo in cui è importato enum (seguire i percorsi di traceback) e inserire il codice seguente appena prima di importare 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

Questo ha risolto il mio problema.


0

Anche io ho avuto questo problema durante l'esecuzione di python -m grpc_tools.protoc --version Ho dovuto impostare PYTHONPATH fino a site-packages e chiudere tutte le finestre del prompt dei comandi e ha funzionato. Spero che aiuti per gli utenti di gRPC.


0

Ho avuto questo problema in ubuntu20.04 in jupyterlab nel mio kernel env virtuale con python3.8 e tensorflow 2.2.0. Il messaggio di errore era

 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

il problema era che nel collegamento simbolico in / usr / bin / python puntava a python2. Soluzione:

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

Spero che python2 muoia presto! Terveisin, Markus


Questa soluzione può creare disastri orribili nel tuo sistema! Dovresti usare virtualenv invece di cambiare il python predefinito per l'intero sistema.
Alex Baranowski

Grazie per la segnalazione. Non ho ancora notato alcun problema (ma evito sempre python2 il più possibile). Gli amanti di Python2 non dovrebbero assolutamente farlo.
Markus Kaukonen

0

Se avere questo problema quando si esegue i test in PyCharm, assicurarsi che la seconda casella è deselezionata nelle configurazioni.


-2

Se qualcuno ha questo problema durante il tentativo di eseguire il kernel Jupyter da un virtualenv, aggiungi semplicemente il corretto PYTHONPATHal kernel.jsontuo kernel virtualenv (Python 3 nell'esempio):

{
 "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"
}
}

La tua directory utente è codificata qui. Questa soluzione non funzionerà per i principianti: spiega cosa sta facendo e dove trovare i file rilevanti.
Tom Kelly,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.