Pourquoi Python 3.6.1 lance AttributeError: le module 'enum' n'a pas d'attribut 'IntFlag'?


119

Je viens d'installer Python 3.6.1 pour MacOS X

Lorsque j'essaie d'exécuter la console (ou d'exécuter quoi que ce soit avec Python3), cette erreur est générée:

  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 existe dans enum.py. Alors, pourquoi est-ce que AttributeError est jeté?


8
Y a-t-il un nom de fichier enum.pydans votre répertoire de travail, par hasard?
juanpa.arrivillaga

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 est dans le $ PATH
BryanWheelock

2
... ce n'est pas ce que j'ai demandé. J'ai demandé si * il y avait un fichier nommé enum.pydans votre répertoire de travail
juanpa.arrivillaga

4
En fait, ça l'était. "Assurez-vous que nulle part dans vos fichiers de configuration shell, PYTHONPATH n'est configuré pour pointer vers votre installation Python 2.7." Cela semble très bien être la cause de cela.
juanpa.arrivillaga

2
Essayez d'exécuter l'interpréteur avec l' -Ioption d'ignorer les packages de site et la variable d'environnement et / ou avec -vpour voir les messages détaillés sur les importations
Ceppo93

Réponses:


230

C'est parce que vous enumn'êtes pas le enummodule de bibliothèque standard . Vous avez probablement enum34installé le package .

Une façon de vérifier si tel est le cas est d'inspecter la propriété enum.__file__

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

Depuis python 3.6, la bibliothèque enum34 n'est plus compatible avec la bibliothèque standard. La bibliothèque est également inutile, vous pouvez donc simplement la désinstaller.

pip uninstall -y enum34

Si vous avez besoin que le code s'exécute sur les versions python à la fois <= 3.4 et> 3.4, vous pouvez essayer d'avoir enum-compatcomme exigence. Il ne s'installe que enum34pour les anciennes versions de python sans l'énumération de bibliothèque standard.


Cela tue ipython2 --> traitlets --> enum34. (Malheureusement, enum34est installé dans .../2.7/site-packages/enumne pas .../2.7/site-packages/enum34- demander des problèmes.)
denis

1
oui vous avez raison - c'est juste une note pour quiconque essaie d'utiliser les deux.
denis

9
Dans mon cas, il m'a donné Skipping enum34 as it is not installed.. J'utilise 3.7
Rotkiv

1
Que faire si print(enum.__file__)je donne ceci: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. Cela signifie-t-il que j'ai une enum bibliothèque standard et non enum34? Edit: ouais, pip uninstall enum34m'a donnéSkipping enum34 as it is not installed.
Andrey

1
@ HåkenLid Cela se produit lorsque j'essaye d'ouvrir un jupyter notebook.
Cynthia GS

89

Je ne sais pas si vous rencontrez toujours ce problème. J'ai eu un problème similaire et j'ai pu le résoudre simplement en désactivantPYTHONPATH

$ unset PYTHONPATH


2
Juste pour info pour les utilisateurs de PyCharm, pour désactiver le PYTHONPATH sur lequel j'ai cliqué Settings->Build, Execution, Deployment->Console->Python Console. J'ai ensuite supprimé la variable PYTHONPATH du champ intitulé Environment variables. Remarque: au moment d'écrire ces lignes, j'utilisais PyCharm 2017.1.2.
MikeyE

Cela fonctionne, mais sans combinaison de chemins qui incluent mes bibliothèques Python 2, je peux le faire fonctionner. J'adorerais savoir pourquoi.
Ulf Aslak

Oui, dans Windows, j'ai redémarré mon invite cmd, cela a fonctionné, peut-être indirectement il a réinitialisé PYTHONPATH
Karan Kaw

12

Pour moi, cette erreur s'est produite après l'installation du composant gcloud app-engine-python afin de l'intégrer dans pycharm. La désinstallation du module a aidé, même si pycharm ne se télécharge plus sur app-engine.


4
J'ai eu cette erreur en exécutant Flask sous PyCharm et je l'ai corrigée en désactivant le support AppEngine du projet (Préférences -> Langues et cadres -> Google App Engine). Le runtime de 2e génération pour Python3 n'utilise pas le serveur de développement du moteur d'application, donc cela a du sens (c'est pour Python 2.x).
Brett

9

Si quelqu'un vient ici en raison de cette erreur lors de l'exécution d'un projet d'environnement standard Python 3.7 du moteur d'application google dans PyCharm, tout ce que vous avez à faire est

  • Assurez-vous que la configuration à exécuter est pour Flask et non pour la configuration de Google App Engine.
  • Ensuite, désactivez la prise en charge de Google App Engine sous Préférences >> Langues et cadre >> Google App Engine

La raison étant selon ce lien

L'objectif général est que votre application soit entièrement portable et s'exécute dans n'importe quel environnement Python standard. Vous écrivez une application Python standard, pas une application Python App Engine. Dans le cadre de ce changement, vous n'êtes plus obligé d'utiliser des API et des services App Engine propriétaires pour les fonctionnalités principales de votre application. Pour le moment, les API App Engine ne sont pas disponibles dans l'environnement d'exécution Python 3.7.

Je suppose que lorsque nous créons un projet python 3.7 dans PyCharm en tant que projet de moteur d'application Google, il essaie toujours de faire de la même manière qu'il le fait pour une application python2.7


Ainsi, lorsque vous écrivez pour Google App Engine à partir de Pycharm, doit-on télécharger manuellement son code dans le cloud ou Pycharm pourra-t-il toujours le télécharger sur App Engine?
Ben

@Ben Je ne suis pas sûr de ce que vous entendez en téléchargeant manuellement du code dans le cloud (Google App Engine). Si vous faites référence au déploiement sur App Engine, utilisez la commande gcloud app deploy. Cela n'a rien à voir avec pycharm.
Joseph Abraham

Je ne suis qu'un amateur dans ce domaine, mais je pensais que l'activation de la prise en charge d'App Engine dans Pycharm vous donnait la possibilité d'utiliser une commande de menu pour déployer votre code. Mais, lorsque vous désactivez la prise en charge du moteur d'application dans Pycharm (c'est-à-dire pour utiliser Python 3.7), vous devez accéder à la ligne de commande pour déployer votre code. Ai-je ce droit ou ai-je mal interprété le fonctionnement du moteur d'application sous 2.7?
Ben

@Ben C'est parce que les outils de support du moteur d'application Pycharm sont ciblés pour Python 2.7. Comme je l'ai mentionné dans ma réponse, Google considère les applications de moteur d'application standard Python 3.7 comme une application Python standard. Et je pense que c'est la raison pour laquelle Pycharm se comporte également de cette façon pour les applications de moteur d'application Python 3.7.
Joseph Abraham

8

DISCLAIMER: S'il vous plaît, @ juanpa.arrivillaga, si vous voyez cette réponse, n'hésitez pas à écrire la vôtre et je supprimerai ce message.

@ juanpa.arrivillaga avait mentionné ci-dessus :

Y a-t-il un nom de fichier enum.py dans votre répertoire de travail, par hasard?

C'était le problème que j'ai rencontré. Je n'étais pas au courant du module enum sur python à l'époque et j'avais nommé mon fichier de test enum.py.

Étant donné que le nom de fichier est le nom du module, il y avait un conflit. Plus d'informations sur les modules ici: https://docs.python.org/2/tutorial/modules.html


Tu m'as sauvé la vie.
Gastón

6

La désactivation de "Assistance Google App Engine" dans les préférences pycharm a résolu ce problème pour moi.

Préférences du moteur d'application pycharm


Travaille pour moi. J'ai eu le même problème en exécutant Flask en mode débogage de PyCharm
Khanh Hua

Cela fonctionne pour moi. Parce qu'en fait, google sdk utilise python2. ...
Jose le

3

La réponse de Håken Lid a aidé à résoudre mon problème (merci!), Dans mon cas présent dans Python3.7 exécutant Flask dans un conteneur Docker ( FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7).

Dans mon cas, enum34était en cours d'installation par une autre bibliothèque ( pip install smartsheet-python-sdk). Pour ceux qui viennent avec un problème de conteneur Docker similaire, voici mon dernier fichier Docker (dépouillé des lignes pertinentes):

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

2

Si vous devez conserver PYTHONPATH pour python2 et python3, vous pouvez écrire des instructions d'alias pour définir le PYTHONPATH approprié dans votre bash_profile:

Codez en dur vos variables PYTHONPATH2 et PYTHONPATH3 dans votre ~ / .bash_profile, et ajoutez les alias suivants à la fin:

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

Mon python(fait référence à python2) car j'utilise plus souvent python2.


Cette suggestion ne fonctionne pas; Toujours la même erreur.
Derek

2

Chaque fois que j'ai ce problème:

AttributeError: le module 'enum' n'a pas d'attribut 'IntFlag'

tout d'abord, je lance la commande:

unset PYTHONPATH 

puis exécutez la commande souhaitée, puis réussissez.


1
c'est le cas parce que votre PYTHONPATH doit pointer vers des éléments appartenant à l'ancienne version de python, comme c'est le cas dans mon cas. Ça a marché
nish

Stale VENV dans mon cas. Merci pour le tuyau :)
Janusz Skonieczny

2

L'installation de la version 1.1.8 de enum34 a fonctionné pour moi.

J'ai pu résoudre ce problème en ajoutant enum34 = "== 1.1.8" à pyproject.toml. Apparemment, enum34 avait une fonctionnalité dans la v1.1.8 qui évitait cette erreur, mais cela a régressé dans la v1.1.9 +. Ceci est juste une solution de contournement. La meilleure solution serait que les packages utilisent des marqueurs d'environnement afin que vous n'ayez pas du tout à installer enum34, sauf si nécessaire.

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


1
Cette solution a fonctionné pour moi
Ajith

1
Cette solution a fonctionné pour moi, en essayant d'utiliser pyinstaller.
Jack Hales

2

Je l'ai fait en utilisant pip install <required-library> --ignore-installed enum34
Une fois que votre bibliothèque requise est installée, recherchez les avertissements pendant la construction. J'ai eu une erreur comme celle-ci:
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.

Pour résoudre ce problème maintenant exécuter la commande: pip freeze | grep enum34. Cela vous donnera la version de l'énum34 installé. Désinstallez-le maintenant pip uninstall enum34et réinstallez la version requise comme
pip install "enum34==1.1.20"


1

J'ai Python 2 et Python 3 installés sur mon ordinateur. Pour une raison étrange, j'ai dans le sys.path de Python 3 également un chemin vers le répertoire de la bibliothèque sitepackage de Python2 lorsque le module re est appelé. Si j'exécute Python 3 et que j'import enum et que print(enum.__file__)le système n'affiche pas ce chemin Python 2 vers les packages de site. Donc, un hack très grossier et sale est de modifier directement le module dans lequel enum est importé (suivez les chemins de traceback) et d'insérer le code suivant juste avant d'importer 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

Cela a résolu mon problème.


0

Même j'ai eu ce problème lors de l'exécution de python -m grpc_tools.protoc --version J'ai dû définir les packages de site PYTHONPATH et arrêter toutes les fenêtres d'invite de commande et cela a fonctionné. J'espère que cela aidera les utilisateurs de gRPC.


0

J'ai eu ce problème dans ubuntu20.04 dans jupyterlab dans mon noyau d'environnement virtuel avec python3.8 et tensorflow 2.2.0. Le message d'erreur était

 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

Le problème était que dans le lien symbolique dans / usr / bin / python pointait vers python2. Solution:

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

J'espère que python2 mourra bientôt! Terveisin, Markus


Cette solution peut créer un désordre horrible dans votre système! Vous devez utiliser virtualenv au lieu de changer le python par défaut pour l'ensemble du système.
Alex Baranowski le

Merci d'avoir fait remarquer cela. Je n'ai pas encore remarqué de problèmes (mais j'évite toujours autant que possible python2). Les amateurs de Python2 ne devraient certainement pas faire cela.
Markus Kaukonen le

0

Si vous rencontrez ce problème lors de l'exécution de tests dans PyCharm, assurez-vous que la deuxième case n'est pas cochée dans les configurations.


-2

Si quelqu'un rencontre ce problème en essayant d'exécuter le noyau Jupyter à partir d'un virtualenv, ajoutez simplement le correct PYTHONPATHà kernel.jsonde votre noyau virtualenv (Python 3 dans l'exemple):

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

Votre répertoire d'utilisateurs est codé en dur ici. Cette solution ne fonctionnera pas pour les novices: veuillez expliquer ce qu'elle fait et où trouver les fichiers pertinents.
Tom Kelly
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.