Mengapa Python 3.6.1 melempar AttributeError: modul 'enum' tidak memiliki atribut 'IntFlag'?

119

Saya baru saja menginstal Python 3.6.1 untuk MacOS X

Ketika saya mencoba menjalankan Konsol (atau menjalankan apa pun dengan Python3), kesalahan ini muncul:

  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'  

Kelas IntFlag ada di dalam enum.py. Jadi, mengapa AttributeError dilemparkan?

BryanWheelock
sumber
8
Apakah ada nama file enum.pydi direktori kerja Anda?
juanpa.arrivillaga
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 ada di $ PATH
BryanWheelock
2
... bukan itu yang saya minta. Saya bertanya apakah * ada file bernama enum.pydi direktori kerja
juanpa.arrivillaga
4
Sebenarnya, memang begitu. “Pastikan bahwa tidak ada di mana pun di file konfigurasi shell Anda, PYTHONPATH diatur untuk mengarah ke instalasi Python 2.7 Anda.” Kedengarannya sangat bagus dapat menyebabkan ini.
juanpa.arrivillaga
2
Cobalah untuk menjalankan interpreter dengan -Iopsi untuk mengabaikan paket situs dan variabel lingkungan dan / atau dengan -vuntuk melihat pesan verbose tentang impor
Ceppo93

Jawaban:

230

Itu karena Anda enumbukan enummodul perpustakaan standar . Anda mungkin telah enum34menginstal paket tersebut .

Salah satu cara untuk memeriksa apakah ini masalahnya adalah dengan memeriksa properti enum.__file__

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

Sejak python 3.6 pustaka enum34 tidak lagi kompatibel dengan pustaka standar. Pustaka juga tidak diperlukan, jadi Anda cukup menghapus instalannya.

pip uninstall -y enum34

Jika Anda memerlukan kode untuk dijalankan pada versi python <= 3.4 dan> 3.4, Anda dapat mencoba memiliki enum-compatsebagai persyaratan. Itu hanya menginstal enum34untuk versi python tanpa perpustakaan standar enum.

Tutup Håken
sumber
Ini membunuh ipython2 --> traitlets --> enum34. (Sayangnya, enum34dipasang di .../2.7/site-packages/enumtidak .../2.7/site-packages/enum34- meminta masalah.)
denis
1
ya, Anda benar - ini hanya catatan bagi siapa saja yang mencoba menggunakan keduanya.
denis
9
Dalam kasus saya itu memberi saya Skipping enum34 as it is not installed.. Saya menggunakan 3,7
Rotkiv
1
Bagaimana jika print(enum.__file__)memberi saya ini: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. Apakah itu berarti saya memiliki enum perpustakaan standar dan tidak enum34? Edit: ya, pip uninstall enum34berikan sayaSkipping enum34 as it is not installed.
Andrey
1
@ HåkenLid Ini terjadi ketika saya mencoba untuk membuka sebuah jupyter notebookjalan.
Cynthia GS
89

Tidak yakin apakah Anda masih mengalami masalah ini. Saya memiliki masalah serupa dan saya dapat mengatasinya hanya dengan membatalkan pengaturanPYTHONPATH

$ unset PYTHONPATH

V. Singh
sumber
2
FYI untuk pengguna PyCharm, untuk membatalkan pengaturan PYTHONPATH yang saya klik Settings->Build, Execution, Deployment->Console->Python Console. Saya kemudian menghapus variabel PYTHONPATH dari bidang berjudul Environment variables. Catatan: pada saat penulisan ini, saya menggunakan PyCharm 2017.1.2.
MikeyE
Ini berfungsi, tetapi tanpa kombinasi jalur yang menyertakan pustaka Python 2 saya, saya dapat membuatnya berfungsi. Saya ingin tahu mengapa.
Ulf Aslak
Ya, Di windows, saya me-restart prompt cmd saya, Berhasil, Mungkin secara tidak langsung mengatur ulang PYTHONPATH
Karan Kaw
12

Bagi saya kesalahan ini terjadi setelah menginstal komponen gcloud app-engine-python untuk diintegrasikan ke dalam pycharm. Menghapus instalasi modul membantu, bahkan jika pycharm sekarang tidak mengunggah ke mesin aplikasi.

mickmackk
sumber
4
Saya mendapat kesalahan ini menjalankan Flask di bawah PyCharm, dan memperbaikinya dengan menonaktifkan dukungan AppEngine dari proyek (Preferensi -> Bahasa & Kerangka -> Google App Engine). Runtime generasi ke-2 untuk Python3 tidak menggunakan server pengembang mesin aplikasi jadi ini masuk akal (ini untuk Python 2.x).
Brett
9

Jika ada yang datang ke sini karena mendapatkan kesalahan ini saat menjalankan proyek lingkungan standar Google app engine Python 3.7 di PyCharm maka yang perlu Anda lakukan hanyalah

  • Pastikan konfigurasi yang akan dijalankan adalah untuk Flask, bukan konfigurasi Google App Engine.
  • Kemudian nonaktifkan dukungan Google App Engine di bawah Preferensi >> Bahasa & Kerangka Kerja >> Google App Engine

Alasannya sesuai tautan ini

Tujuan keseluruhannya adalah bahwa aplikasi Anda harus sepenuhnya portabel dan berjalan di lingkungan Python standar apa pun. Anda menulis aplikasi Python standar, bukan aplikasi App Engine Python. Sebagai bagian dari pergeseran ini, Anda tidak lagi diharuskan untuk menggunakan API dan layanan App Engine berpemilik untuk fungsi inti aplikasi Anda. Saat ini, API App Engine tidak tersedia di waktu proses Python 3.7.

Saya kira ketika kita membuat proyek python 3.7 di PyCharm sebagai proyek mesin aplikasi Google, ia masih mencoba melakukan cara yang sama untuk aplikasi python2.7

Joseph Abraham
sumber
Jadi, ketika menulis untuk Google App Engine dari Pycharm, haruskah seseorang mengunggah kodenya secara manual ke cloud atau apakah Pycharm masih dapat mengunggah ke App Engine?
Ben
@Ben Saya tidak yakin apa yang Anda maksud dengan mengupload kode secara manual ke cloud (Google App Engine). Jika Anda mengacu pada penerapan ke App Engine, itu menggunakan perintah gcloud app deploy. Itu tidak ada hubungannya dengan pycharm.
Joseph Abraham
Saya hanya seorang amatir dalam hal ini, tetapi saya pikir mengaktifkan dukungan App Engine di Pycharm memberi Anda kemampuan untuk menggunakan perintah menu untuk menerapkan kode Anda. Tapi, saat Anda menonaktifkan dukungan mesin aplikasi di Pycharm (yaitu untuk menggunakan Python 3.7), Anda harus membuka baris perintah untuk menerapkan kode Anda. Apakah saya memiliki hak itu atau apakah saya salah menafsirkan cara kerja mesin aplikasi di bawah 2.7?
Ben
@Ben Itu karena alat pendukung mesin aplikasi Pycharm ditargetkan untuk Python 2.7. Seperti yang telah saya sebutkan dalam jawaban saya, Google menganggap aplikasi mesin Aplikasi Standar Python 3.7 sebagai Aplikasi Python standar. Dan saya yakin inilah alasan mengapa Pycharm juga berperilaku seperti ini untuk aplikasi mesin aplikasi Python 3.7.
Joseph Abraham
8

DISCLAIMER: Tolong, @ juanpa.arrivillaga, jika Anda melihat jawaban ini, silakan tulis sendiri dan saya akan menghapus posting ini.

@ juanpa.arrivillaga telah menyebutkan di atas :

Apakah ada nama file enum.py di direktori kerja Anda?

Ini adalah masalah yang saya temui. Saya tidak mengetahui modul enum pada python pada saat itu dan telah menamai file pengujian saya enum.py.

Karena nama file adalah nama modul, terjadi konflik. Info lebih lanjut tentang modul di sini: https://docs.python.org/2/tutorial/modules.html

dannypaz
sumber
Anda telah menyelamatkan hidup saya.
Gaston
6

Menonaktifkan "Dukungan Google App Engine" di preferensi pycharm memperbaiki masalah ini untuk saya.

preferensi mesin aplikasi pycharm

chmoder.dll
sumber
Bekerja untuk saya. Saya mengalami masalah yang sama saat menjalankan Flask dalam mode debug dari PyCharm
Khanh Hua
Ini berhasil untuk saya. Karena sebenarnya google sdk menggunakan python2. ...
Jose
3

Jawaban Håken Lid membantu memecahkan masalah saya (terima kasih!), Dalam kasus saya hadir dengan Python3.7 menjalankan Flask dalam wadah Docker ( FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7).

Dalam kasus saya, enum34sedang diinstal oleh perpustakaan lain ( pip install smartsheet-python-sdk). Bagi mereka yang datang dengan masalah kontainer Docker yang serupa, inilah Dockerfile terakhir saya (dilucuti ke baris yang relevan):

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

Jika Anda harus menyimpan PYTHONPATH untuk python2 dan python3, Anda dapat menulis pernyataan alias untuk menyetel PYTHONPATH yang tepat di bash_profile Anda:

Buat kode keras variabel PYTHONPATH2, dan PYTHONPATH3 di ~ / .bash_profile Anda, dan tambahkan alias berikut di akhir:

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

Saya python(mengacu pada python2) karena saya lebih sering menggunakan python2.

pengguna3804602
sumber
Saran ini tidak berhasil; masih mendapatkan kesalahan yang sama.
Derek
2

Kapan pun saya mendapat masalah ini:

AttributeError: modul 'enum' tidak memiliki atribut 'IntFlag'

cukup pertama saya jalankan perintah:

unset PYTHONPATH 

dan kemudian jalankan perintah yang saya inginkan lalu dapatkan sukses dalam hal itu.

Gaurav
sumber
1
ini karena PYTHONPATH Anda pasti mengarah ke barang-barang milik python versi lama, seperti halnya, dalam kasus saya. Ini bekerja
nish
VENV basi dalam kasus saya. Terima kasih atas tipnya :)
Janusz Skonieczny
2

Menginstal versi 1.1.8 dari enum34 berhasil untuk saya.

Saya bisa memperbaiki ini dengan menambahkan enum34 = "== 1.1.8" ke pyproject.toml. Rupanya enum34 memiliki fitur di v1.1.8 yang menghindari kesalahan ini, tapi ini mundur di v1.1.9 +. Ini hanya solusi. Solusi yang lebih baik adalah paket yang menggunakan penanda lingkungan sehingga Anda tidak perlu menginstal enum34 sama sekali kecuali diperlukan.

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

Josh Wolff
sumber
1
Solusi ini berhasil untuk saya
Ajith
1
Solusi ini berhasil untuk saya, saat mencoba menggunakan pyinstaller.
Jack Hales
2

Saya melakukannya dengan menggunakan pip install <required-library> --ignore-installed enum34
Setelah perpustakaan yang Anda butuhkan diinstal, cari peringatan selama pembuatan. Saya mendapat Kesalahan seperti ini:
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.

Untuk memperbaiki masalah ini sekarang menjalankan perintah: pip freeze | grep enum34. Ini akan memberi Anda versi dari enum34 yang diinstal. Sekarang hapus instalannya pip uninstall enum34dan instal ulang versi yang diperlukan sebagai
pip install "enum34==1.1.20"

Sidharth Rai
sumber
1

Saya memiliki Python 2 dan Python 3 yang diinstal di komputer saya. Untuk beberapa alasan aneh yang saya miliki di sys.path Python 3 juga jalur ke direktori pustaka sitepackage Python2 ketika modul ulang dipanggil. Jika saya menjalankan Python 3 dan mengimpor enum dan print(enum.__file__)sistem tidak menunjukkan jalur Python 2 ini ke paket situs. Jadi peretasan yang sangat kasar dan kotor adalah, untuk langsung memodifikasi modul di mana enum diimpor (ikuti jalur traceback) dan masukkan kode berikut tepat sebelum mengimpor 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

Itu memecahkan masalah saya.

bunkus
sumber
0

Bahkan saya mengalami masalah ini saat menjalankan python -m grpc_tools.protoc --version Harus mengatur PYTHONPATH hingga paket situs dan mematikan semua jendela prompt perintah dan berhasil. Semoga membantu bagi pengguna gRPC.

Ezio
sumber
0

Saya mengalami masalah ini di ubuntu20.04 di jupyterlab di kernel env virtual saya dengan python3.8 dan tensorflow 2.2.0. Pesan kesalahan adalah

 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

Masalahnya adalah bahwa dalam tautan simbolik di / usr / bin / python menunjuk ke python2. Larutan:

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

Saya berharap python2 akan segera mati! Terveisin, Markus

Markus Kaukonen
sumber
Solusi ini dapat membuat sistem Anda berantakan! Anda harus menggunakan virtualenv daripada mengubah python default untuk keseluruhan sistem.
Alex Baranowski
Terima kasih telah menunjukkannya. Saya belum melihat ada masalah (tapi saya selalu menghindari python2 sebanyak mungkin). Pecinta Python2 harus tidak melakukan ini.
Markus Kaukonen
0

Jika Anda mengalami masalah ini ketika menjalankan tes di PyCharm, pastikan kotak kedua adalah dicentang di konfigurasi.

emmmphd
sumber
-2

Jika ada yang mengalami masalah ini saat mencoba menjalankan kernel Jupyter dari virtualenv, cukup tambahkan yang benar PYTHONPATHke kernel.jsonkernel virtualenv Anda (misalnya Python 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
sumber
Direktori pengguna Anda di-hardcode di sini. Solusi ini tidak akan berfungsi untuk pemula: tolong jelaskan apa yang dilakukannya dan di mana menemukan file yang relevan.
Tom Kelly