Por que o Python 3.6.1 lança AttributeError: o módulo 'enum' não tem o atributo 'IntFlag'?

119

Acabei de instalar o Python 3.6.1 para MacOS X

Quando tento executar o console (ou executar qualquer coisa com Python3), este erro é gerado:

  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'  

A classe IntFlag existe em enum.py. Então, por que o AttributeError está sendo lançado?

BryanWheelock
fonte
8
Existe um nome de arquivo enum.pyem seu diretório de trabalho, por acaso?
juanpa.arrivillaga
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 está no $ PATH
BryanWheelock
2
... não foi isso que eu perguntei. Eu perguntei se * havia um arquivo chamado enum.pyem seu diretório de trabalho
juanpa.arrivillaga
4
Na verdade, foi. “Certifique-se de que em nenhum lugar dos seus arquivos de configuração do shell, PYTHONPATH esteja definido para apontar para a instalação do Python 2.7.” Parece que isso pode muito bem estar causando isso.
juanpa.arrivillaga
2
Tente executar o interpretador com a -Iopção de ignorar os pacotes do site e a variável de ambiente e / ou com -vpara ver as mensagens detalhadas sobre as importações
Ceppo93

Respostas:

230

É porque seu enumnão é o enummódulo de biblioteca padrão . Você provavelmente tem o pacote enum34instalado.

Uma forma de verificar se este é o caso é inspecionar a propriedade enum.__file__

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

Desde o python 3.6, a biblioteca enum34 não é mais compatível com a biblioteca padrão. A biblioteca também é desnecessária, então você pode simplesmente desinstalá-la.

pip uninstall -y enum34

Se você precisa que o código seja executado nas versões Python <= 3.4 e> 3.4, você pode tentar ter enum-compatcomo requisito. Ele instala apenas enum34para versões mais antigas do python sem a biblioteca padrão enum.

Håken Lid
fonte
Isso mata ipython2 --> traitlets --> enum34. (Infelizmente, enum34está instalado em .../2.7/site-packages/enumnão .../2.7/site-packages/enum34- pedindo problemas.)
denis
1
sim, você está certo - é apenas uma nota para quem tentar usar os dois.
denis
9
No meu caso, deu-me Skipping enum34 as it is not installed.. Estou usando o 3.7
Rotkiv
1
E se print(enum.__file__)me dá essa: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. Isso significa que tenho uma enum biblioteca padrão e não enum34? Edit: sim, pip uninstall enum34me deuSkipping enum34 as it is not installed.
Andrey
1
@ HåkenLid Isso acontece quando tento abrir um jupyter notebookby the way.
Cynthia GS
89

Não tenho certeza se você ainda tem esse problema. Tive um problema semelhante e consegui resolvê-lo simplesmente desestabilizandoPYTHONPATH

$ unset PYTHONPATH

V. Singh
fonte
2
Apenas para sua informação para usuários de PyCharm, para remover o PYTHONPATH em que cliquei Settings->Build, Execution, Deployment->Console->Python Console. Em seguida, removi a variável PYTHONPATH do campo intitulado Environment variables. Observação: no momento da redação deste artigo, eu estava usando o PyCharm 2017.1.2.
MikeyE
Isso funciona, mas sem combinação de caminhos que inclua minhas bibliotecas Python 2, posso fazer com que funcione. Adoraria saber por quê.
Ulf Aslak
Sim, no Windows, reiniciei meu prompt de cmd, funcionou, talvez indiretamente tenha redefinido PYTHONPATH
Karan Kaw
12

Para mim, esse erro ocorreu após a instalação do componente app-engine-python do gcloud para integrar ao pycharm. Desinstalar o módulo ajudou, mesmo que o pycharm não esteja sendo carregado no app-engine.

mickmackk
fonte
4
Recebi este erro ao executar o Flask no PyCharm e corrigi-lo desativando o suporte do AppEngine do projeto (Preferências -> Idiomas e estruturas -> Google App Engine). O tempo de execução de 2ª geração para Python3 não usa o servidor de desenvolvimento do motor de aplicativo, então isso faz sentido (é para Python 2.x).
Brett
9

Se alguém vier aqui devido a este erro ao executar um projeto de ambiente padrão do Google app engine Python 3.7 no PyCharm, tudo o que você precisa fazer é

  • Certifique-se de que a configuração a ser executada seja para Flask, não para a configuração do Google App Engine.
  • Em seguida, desative o suporte do Google App Engine em Preferências >> Idiomas e estrutura >> Google App Engine

O motivo é conforme este link

O objetivo geral é que seu aplicativo seja totalmente portátil e executado em qualquer ambiente Python padrão. Você escreve um aplicativo Python padrão, não um aplicativo Python do App Engine. Como parte dessa mudança, você não precisa mais usar APIs e serviços proprietários do App Engine para a funcionalidade principal do seu aplicativo. No momento, as APIs do App Engine não estão disponíveis no tempo de execução do Python 3.7.

Acho que quando criamos um projeto python 3.7 no PyCharm como um projeto do Google app engine, ele ainda tenta fazer a mesma coisa que faz para um aplicativo python 2.7

Joseph Abraham
fonte
Portanto, ao escrever para o Google App Engine a partir do Pycharm, deve-se fazer o upload manual do código para a nuvem ou o Pycharm ainda poderá fazer o upload para o App Engine?
Ben
@Ben Não tenho certeza do que você quer dizer com upload manual de código para a nuvem (Google App Engine). Se você está se referindo à implantação no App Engine, use o comando gcloud app deploy. Isso não tem nada a ver com pycharm.
Joseph Abraham
Eu sou apenas um amador nisso, mas achei que habilitar o suporte do App Engine no Pycharm deu a você a capacidade de usar um comando de menu para implantar seu código. Mas, quando você desativa o suporte do app engine no Pycharm (ou seja, para usar o Python 3.7), você precisa ir para a linha de comando para implantar seu código. Estou certo ou interpretei mal como as coisas do App Engine funcionavam no 2.7?
Ben
@Ben Isso ocorre porque as ferramentas de suporte do mecanismo de aplicativo Pycharm são direcionadas ao Python 2.7. Como mencionei em minha resposta, o Google considera os aplicativos Python 3.7 padrão do App engine como um aplicativo Python padrão. E eu acredito que essa é a razão pela qual o Pycharm também se comporta dessa maneira para aplicativos de mecanismo de aplicativo Python 3.7.
Joseph Abraham
8

AVISO LEGAL: Por favor, @ juanpa.arrivillaga, se você vir esta resposta, fique à vontade para escrever a sua própria e eu removerei esta postagem.

@ juanpa.arrivillaga mencionou acima :

Existe um nome de arquivo enum.py em seu diretório de trabalho, por acaso?

Este foi o problema que encontrei. Eu não conhecia o módulo enum em python na época e havia nomeado meu arquivo de teste enum.py.

Como o nome do arquivo é o nome do módulo, houve um conflito. Mais informações sobre os módulos aqui: https://docs.python.org/2/tutorial/modules.html

dannypaz
fonte
Você salvou minha vida.
Gastón
6

Desativar o "Suporte do Google App Engine" nas preferências do pycharm corrigiu esse problema para mim.

preferências do pycharm app engine

chmoder
fonte
Funciona para mim. Tive o mesmo problema ao executar o Flask no modo de depuração do PyCharm
Khanh Hua
Isso funciona para mim. Porque, na verdade, o google sdk usa python2. ...
José Mar
3

A resposta de Håken Lid ajudou a resolver meu problema (obrigado!), No meu caso presente no Python3.7 executando o Flask em um contêiner do Docker ( FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7).

No meu caso, enum34estava sendo instalado por outra biblioteca ( pip install smartsheet-python-sdk). Para aqueles que vêm com um problema semelhante de contêiner do Docker, aqui está meu Dockerfile final (reduzido às linhas relevantes):

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

No caso de você ter que manter PYTHONPATH para python2 e python3, você pode escrever declarações de alias para definir o PYTHONPATH adequado em seu bash_profile:

Codifique suas variáveis ​​PYTHONPATH2 e PYTHONPATH3 em seu ~ / .bash_profile e adicione os seguintes aliases no final dele:

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

Meu python(refere-se a python2) porque eu uso python2 com mais frequência

user3804602
fonte
Essa sugestão não funciona; ainda obtém o mesmo erro.
Derek
2

Sempre que tive este problema:

AttributeError: o módulo 'enum' não tem nenhum atributo 'IntFlag'

simplesmente primeiro executo o comando:

unset PYTHONPATH 

e, em seguida, execute o comando desejado e obtive sucesso nisso.

Gaurav
fonte
1
isso ocorre porque seu PYTHONPATH deve estar apontando para coisas pertencentes à versão antiga do python, como está, no meu caso. Funcionou
final de
VENV obsoleto no meu caso. Obrigado pela dica :)
Janusz Skonieczny 01 de
2

A instalação da versão 1.1.8 do enum34 funcionou para mim.

Consegui corrigir isso adicionando enum34 = "== 1.1.8" a pyproject.toml. Aparentemente, enum34 tinha um recurso na v1.1.8 que evitou esse erro, mas regrediu na v1.1.9 +. No entanto, esta é apenas uma solução alternativa. A melhor solução seria que os pacotes usassem marcadores de ambiente para que você não precisasse instalar o enum34 a menos que necessário.

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

Josh Wolff
fonte
1
Esta solução funcionou para mim
Ajith
1
Esta solução funcionou para mim, ao tentar usar pyinstaller.
Jack Hales
2

Eu fiz usando pip install <required-library> --ignore-installed enum34
Uma vez que sua biblioteca necessária for instalada, procure por avisos durante a construção. Recebi um erro 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 corrigir esse problema agora executar o comando: pip freeze | grep enum34. Isso fornecerá a versão do enum34 instalado. Agora desinstale-o pip uninstall enum34e reinstale a versão necessária como
pip install "enum34==1.1.20"

Sidharth Rai
fonte
1

Tenho Python 2 e Python 3 instalados no meu computador. Por alguma razão estranha, tenho no sys.path do Python 3 também um caminho para o diretório da biblioteca do sitepackage do Python2 quando o módulo re é chamado. Se eu executar o Python 3 e importar enum e print(enum.__file__)o sistema não mostrar esse caminho do Python 2 para os pacotes do site. Portanto, um hack muito bruto é modificar diretamente o módulo no qual o enum é importado (siga os caminhos de traceback) e inserir o seguinte código antes de importar o 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

Isso resolveu meu problema.

bunkus
fonte
0

Até eu tive esse problema ao executar python -m grpc_tools.protoc --version Tive que definir o PYTHONPATH para os pacotes do site e desligar todas as janelas do prompt de comando e funcionou. Espero que ajude para usuários do gRPC.

Ezio
fonte
0

Eu tive esse problema no ubuntu20.04 no jupyterlab no meu kernel env virtual com python3.8 e tensorflow 2.2.0. A mensagem de erro 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

O problema era que no link simbólico em / usr / bin / python estava apontando para python2. Solução:

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

Espero que python2 morra logo! Terveisin, Markus

Markus Kaukonen
fonte
Esta solução pode causar uma confusão horrível no seu sistema! Você deve usar o virtualenv em vez de alterar o python padrão para todo o sistema.
Alex Baranowski
Obrigado por apontar isso. Ainda não notei nenhum problema (mas sempre evito python2 tanto quanto possível). Os amantes do Python2 definitivamente não devem fazer isso.
Markus Kaukonen
0

Se você tiver esse problema ao executar testes no PyCharm, certifique-se de que a segunda caixa esteja desmarcada nas configurações.

emmmphd
fonte
-2

Se alguém estiver tendo esse problema ao tentar executar o kernel do Jupyter a partir de um virtualenv, basta adicionar correto PYTHONPATHao kernel.jsondo seu kernel virtualenv (Python 3 no exemplo):

{
 "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
fonte
Seu diretório de usuário está codificado aqui. Esta solução não funcionará para novatos: explique o que está fazendo e onde encontrar os arquivos relevantes.
Tom Kelly