¿Por qué Python 3.6.1 arroja AttributeError: el módulo 'enum' no tiene el atributo 'IntFlag'?

119

Acabo de instalar Python 3.6.1 para MacOS X

Cuando intento ejecutar la consola (o ejecutar cualquier cosa con Python3), aparece este error:

  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 clase IntFlag existe dentro de enum.py. Entonces, ¿por qué se lanza AttributeError?

BryanWheelock
fuente
8
¿Hay un nombre de archivo enum.pyen su directorio de trabajo, por casualidad?
juanpa.arrivillaga
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 está en $ PATH
BryanWheelock
2
... eso no es lo que pregunté. Pregunté si * había un archivo llamado enum.pyen su directorio de trabajo
juanpa.arrivillaga
4
De hecho, lo fue. "Asegúrese de que en ninguna parte de sus archivos de configuración de shell, PYTHONPATH esté configurado para apuntar a su instalación de Python 2.7". Parece que podría estar causando esto.
juanpa.arrivillaga
2
Intente ejecutar el intérprete con la -Iopción para ignorar los paquetes del sitio y la variable de entorno y / o -vpara ver mensajes detallados sobre las importaciones
Ceppo93

Respuestas:

230

Es porque tu enumno es el enummódulo de biblioteca estándar . Probablemente tengas el paquete enum34instalado.

Una forma de comprobar si este es el caso es inspeccionar la propiedad enum.__file__

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

Desde python 3.6, la biblioteca enum34 ya no es compatible con la biblioteca estándar. La biblioteca también es innecesaria, por lo que simplemente puede desinstalarla.

pip uninstall -y enum34

Si necesita que el código se ejecute en versiones de Python tanto <= 3.4 como> 3.4, puede intentar tenerlo enum-compatcomo requisito. Solo se instala enum34para versiones anteriores de python sin la enumeración de biblioteca estándar.

Tapa Håken
fuente
Esto mata ipython2 --> traitlets --> enum34. (Desafortunadamente, enum34está instalado en .../2.7/site-packages/enumno .../2.7/site-packages/enum34- buscando problemas)
denis
1
sí, tienes razón, es solo una nota para cualquiera que intente usar ambos.
denis
9
En mi caso me dio Skipping enum34 as it is not installed.. Estoy usando 3.7
Rotkiv
1
¿Y si print(enum.__file__)me da esto /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py? ¿Significa que tengo una enum biblioteca estándar y no enum34? Editar: sí, pip uninstall enum34me lo dioSkipping enum34 as it is not installed.
Andrey
1
@ HåkenLid Esto sucede cuando intento abrir un jupyter notebookpor cierto.
Cynthia GS
89

No estoy seguro de si aún tiene este problema. Tuve un problema similar y pude resolverlo simplemente desarmandoPYTHONPATH

$ unset PYTHONPATH

V. Singh
fuente
2
Solo para su información para usuarios de PyCharm, para desarmar el PYTHONPATH en el que hice clic Settings->Build, Execution, Deployment->Console->Python Console. Luego eliminé la variable PYTHONPATH del campo titulado Environment variables. Nota: en el momento de escribir este artículo, estaba usando PyCharm 2017.1.2.
MikeyE
Esto funciona, pero sin una combinación de rutas que incluya mis bibliotecas de Python 2, ¿puedo hacer que funcione? Me encantaría saber por qué.
Ulf Aslak
Sí, en Windows, reinicié mi indicador de cmd, funcionó, tal vez indirectamente reinició PYTHONPATH
Karan Kaw
12

Para mí, este error se produjo después de instalar el componente de gcloud app-engine-python para integrarlo en pycharm. La desinstalación del módulo ayudó, incluso si pycharm ahora no se carga en app-engine.

Mickmackk
fuente
4
Recibí este error al ejecutar Flask en PyCharm, y lo solucioné deshabilitando la compatibilidad con AppEngine en el proyecto (Preferencias -> Idiomas y marcos -> Google App Engine). El tiempo de ejecución de segunda generación para Python3 no usa el servidor de desarrollo del motor de aplicaciones, por lo que esto tiene sentido (es para Python 2.x).
Brett
9

Si alguien viene aquí porque recibe este error mientras ejecuta un proyecto de entorno estándar Python 3.7 del motor de aplicaciones de Google en PyCharm, entonces todo lo que necesita hacer es

  • Asegúrese de que la configuración para ejecutar sea para Flask, no para la configuración de Google App Engine.
  • Luego, desactive la compatibilidad con Google App Engine en Preferencias >> Idiomas y marco >> Google App Engine

La razón es según este enlace.

El objetivo general es que su aplicación sea completamente portátil y se ejecute en cualquier entorno estándar de Python. Escribe una aplicación Python estándar, no una aplicación Python de App Engine. Como parte de este cambio, ya no es necesario que utilice servicios y API de App Engine patentados para la funcionalidad principal de su aplicación. En este momento, las API de App Engine no están disponibles en el tiempo de ejecución de Python 3.7.

Supongo que cuando creamos un proyecto de Python 3.7 en PyCharm como un proyecto de motor de aplicaciones de Google, todavía intenta hacer lo mismo que lo hace con una aplicación de Python2.7

José Abraham
fuente
Entonces, al escribir para Google App Engine desde Pycharm, ¿se debe cargar manualmente su código en la nube o Pycharm aún podrá cargarlo en App Engine?
Ben
@Ben No estoy seguro de lo que quiere decir con cargar código manualmente en la nube (Google App Engine). Si te refieres a la implementación en App Engine, usa el comando gcloud app deploy. Eso no tiene nada que ver con Pycharm.
Joseph Abraham
Solo soy un aficionado en esto, pero pensé que habilitar el soporte de App Engine en Pycharm le brindaba la capacidad de usar un comando de menú para implementar su código. Pero, cuando deshabilita el soporte del motor de la aplicación en Pycharm (es decir, para usar Python 3.7), debe ir a la línea de comando para implementar su código. ¿Tengo ese derecho o malinterpreté cómo funcionaba el motor de la aplicación en 2.7?
Ben
@Ben Eso es porque las herramientas de soporte del motor de la aplicación Pycharm están diseñadas para Python 2.7. Como mencioné en mi respuesta, Google considera las aplicaciones del motor de la aplicación estándar Python 3.7 como una aplicación estándar de Python. Y creo que esta es la razón por la que Pycharm también se comporta de esta manera para las aplicaciones del motor de aplicaciones Python 3.7.
Joseph Abraham
8

DESCARGO DE RESPONSABILIDAD: Por favor, @ juanpa.arrivillaga, si ve esta respuesta, no dude en escribir la suya propia y eliminaré esta publicación.

@ juanpa.arrivillaga había mencionado anteriormente :

¿Existe un nombre de archivo enum.py en su directorio de trabajo, por casualidad?

Este fue el problema que encontré. No estaba al tanto del módulo de enumeración en Python en ese momento y había nombrado mi archivo de pruebaenum.py .

Dado que el nombre del archivo es el nombre del módulo, hubo un conflicto. Más información sobre los módulos aquí: https://docs.python.org/2/tutorial/modules.html

dannypaz
fuente
Me has salvado la vida.
Gastón
6

Deshabilitar "Google App Engine Support" en las preferencias de Pycharm solucionó este problema.

preferencias del motor de la aplicación pycharm

chmoder
fuente
Funciona para mi. Tuve el mismo problema al ejecutar Flask en modo de depuración desde PyCharm
Khanh Hua
Esto funciona para mi. Porque en realidad google sdk usa python2. ...
Jose mar
3

La respuesta de Håken Lid ayudó a resolver mi problema (¡gracias!), En mi caso presente en Python3.7 ejecutando Flask en un contenedor Docker (FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7 ).

En mi caso, enum34estaba siendo instalado por otra biblioteca ( pip install smartsheet-python-sdk). Para aquellos que vienen con un problema similar de contenedor de Docker, aquí está mi último Dockerfile (despojado de las líneas relevantes):

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

En caso de que tenga que mantener PYTHONPATH tanto para python2 como para python3, puede escribir declaraciones de alias para establecer el PYTHONPATH adecuado en su bash_profile:

Codifique sus variables PYTHONPATH2 y PYTHONPATH3 en su ~ / .bash_profile, y agregue los siguientes alias al final:

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

Mi python(se refiere a python2) ya que uso python2 con más frecuencia.

usuario3804602
fuente
Esta sugerencia no funciona; Todavía obtengo el mismo error.
Derek
2

Cuando alguna vez tengo este problema:

AttributeError: el módulo 'enum' no tiene atributo 'IntFlag'

simplemente primero ejecuto el comando:

unset PYTHONPATH 

y luego ejecutar mi comando deseado y luego tener éxito en eso.

Gaurav
fuente
1
esto es así porque su PYTHONPATH debe apuntar a cosas que pertenecen a la versión anterior de Python, como es, en mi caso. Funcionó
nish
VENV rancio en mi caso. Gracias por el consejo :)
Janusz Skonieczny
2

La instalación de la versión 1.1.8 de enum34 funcionó para mí.

Pude arreglar esto agregando enum34 = "== 1.1.8" a pyproject.toml. Aparentemente, enum34 tenía una característica en v1.1.8 que evitaba este error, pero esto retrocedió en v1.1.9 +. Sin embargo, esto es solo una solución. La mejor solución sería que los paquetes usen marcadores de entorno para que no tenga que instalar enum34 a menos que sea necesario.

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

Josh Wolff
fuente
1
Esta solución funcionó para mí
Ajith
Esta solución funcionó para mí, al intentar usar pyinstaller.
Jack Hales hace
2

Lo hice usando pip install <required-library> --ignore-installed enum34
Una vez que la biblioteca requerida esté instalada, busque advertencias durante la compilación. Tengo un error como este:
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.

Para solucionar este problema ahora ejecutar el comando: pip freeze | grep enum34. Esto le dará la versión del enum34 instalado. Ahora desinstálelo pip uninstall enum34y reinstale la versión requerida como
pip install "enum34==1.1.20"

Sidharth Rai
fuente
1

Tengo Python 2 y Python 3 instalados en mi computadora. Por alguna extraña razón, tengo en el sys.path de Python 3 también una ruta al directorio de la biblioteca del paquete de sitio de Python2 cuando se llama al módulo re. Si ejecuto Python 3 e importo enum y print(enum.__file__)el sistema no muestra esta ruta de Python 2 a los paquetes del sitio. Entonces, un truco muy rudo y sucio es modificar directamente el módulo en el que se importa la enumeración (siga las rutas de rastreo) e inserte el siguiente código justo antes de importar la enumeración:

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

Eso resolvió mi problema.

bunkus
fuente
0

Incluso tuve este problema mientras ejecutaba python -m grpc_tools.protoc --version Tuve que configurar PYTHONPATH hasta los paquetes del sitio y cerrar todas las ventanas del símbolo del sistema y funcionó. Espero que ayude a los usuarios de gRPC.

Ezio
fuente
0

Tuve este problema en ubuntu20.04 en jupyterlab en mi kernel env virtual con python3.8 y tensorflow 2.2.0. El mensaje de error 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

El problema era que en el enlace simbólico en / usr / bin / python apuntaba a python2. Solución:

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

¡Espero que python2 muera pronto! Terveisin, Markus

Markus Kaukonen
fuente
¡Esta solución puede causar un desastre horrible en su sistema! Debería usar virtualenv en lugar de cambiar python predeterminado para todo el sistema.
Alex Baranowski
Gracias por señalar eso. Todavía no he notado ningún problema (pero siempre evito python2 tanto como puedo). Los amantes de Python2 definitivamente no deberían hacer esto.
Markus Kaukonen
0

Si usted tiene este problema al ejecutar pruebas en PyCharm, asegúrese de que la segunda caja es marcada en las configuraciones.

emmmphd
fuente
-2

Si alguien está teniendo este problema al intentar ejecutar Jupyter núcleo de un virtualenv, sólo tiene que añadir correcta PYTHONPATHal kernel.jsonde su núcleo virtualenv (Python 3 en el ejemplo):

{
 "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
fuente
Su directorio de usuario está codificado aquí. Esta solución no funcionará para los principiantes: explique qué está haciendo y dónde encontrar los archivos relevantes.
Tom Kelly