ทำไม Python 3.6.1 ถึงพ่น AttributeError: module 'enum' จึงไม่มีแอตทริบิวต์ 'IntFlag'


120

ฉันเพิ่งติดตั้ง Python 3.6.1 สำหรับ MacOS X

เมื่อฉันพยายามเรียกใช้ Console (หรือรันอะไรก็ตามด้วย Python3) ข้อผิดพลาดนี้จะเกิดขึ้น:

  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'  

IntFlag ของคลาสมีอยู่ภายใน enum.py แล้วทำไม AttributeError ถึงถูกโยน?


8
มีชื่อไฟล์enum.pyในไดเร็กทอรีการทำงานของคุณโดยบังเอิญหรือไม่?
juanpa.arrivillaga

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 อยู่ใน $ PATH
BryanWheelock

2
... นั่นไม่ใช่สิ่งที่ฉันถาม ฉันถามว่า * มีไฟล์ชื่อenum.pyในไดเรกทอรีการทำงาน
juanpa.arrivillaga

4
ที่จริงมันเป็น "ตรวจสอบให้แน่ใจว่าไม่มีที่ไหนในไฟล์คอนฟิกูเรชันเชลล์ของคุณ PYTHONPATH ถูกตั้งค่าให้ชี้ไปที่การติดตั้ง Python 2.7 ของคุณ" ซึ่งดูเหมือนว่าจะเป็นสาเหตุนี้ได้เป็นอย่างดี
juanpa.arrivillaga

2
พยายามเรียกใช้ล่ามด้วย-Iตัวเลือกเพื่อละเว้นแพ็คเกจไซต์และตัวแปรสภาพแวดล้อมและ / หรือด้วย-vเพื่อดูข้อความแบบละเอียดเกี่ยวกับการนำเข้า
Ceppo93

คำตอบ:


232

เป็นเพราะคุณenumไม่ใช่enumโมดูลไลบรารีมาตรฐาน คุณอาจenum34ติดตั้งแพคเกจแล้ว

วิธีหนึ่งในการตรวจสอบว่าเป็นกรณีนี้คือการตรวจสอบทรัพย์สิน enum.__file__

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

เนื่องจาก python 3.6 ไลบรารี enum34 ไม่สามารถทำงานร่วมกับไลบรารีมาตรฐานได้อีกต่อไป ห้องสมุดก็ไม่จำเป็นเช่นกันดังนั้นคุณสามารถถอนการติดตั้งได้

pip uninstall -y enum34

หากคุณต้องการโค้ดเพื่อรันบนเวอร์ชัน python ทั้ง <= 3.4 และ> 3.4 คุณสามารถลองenum-compatกำหนดเป็นข้อกำหนดได้ ติดตั้งเฉพาะenum34สำหรับ python เวอร์ชันเก่าที่ไม่มี enum ไลบรารีมาตรฐาน


ipython2 --> traitlets --> enum34ฆ่านี้ ( แต่น่าเสียดายที่enum34มีการติดตั้งใน.../2.7/site-packages/enumไม่.../2.7/site-packages/enum34. - ถามปัญหา)
เดนิส

1
ใช่คุณพูดถูก - เป็นเพียงบันทึกสำหรับทุกคนที่พยายามใช้ทั้งสองอย่าง
denis

9
ในกรณีของฉันมันให้ฉันSkipping enum34 as it is not installed.. ฉันใช้ 3.7
Rotkiv

1
จะเป็นอย่างไรหากprint(enum.__file__)ให้สิ่งนี้แก่ฉัน: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. หมายความว่าฉันมีenum ห้องสมุดมาตรฐานไม่ใช่enum34เหรอ? แก้ไข: ใช่pip uninstall enum34ให้ฉันSkipping enum34 as it is not installed.
Andrey

1
@ HåkenLidสิ่งนี้เกิดขึ้นเมื่อฉันพยายามเปิดjupyter notebookข้างทาง
Cynthia GS

90

ไม่แน่ใจว่าคุณยังมีปัญหานี้หรือไม่ ฉันมีปัญหาที่คล้ายกันและสามารถแก้ไขได้ง่ายๆโดยการยกเลิกการตั้งค่าPYTHONPATH

$ unset PYTHONPATH


2
เพียง FYI สำหรับผู้ใช้ PyCharm เพื่อล้างค่า PYTHONPATH Settings->Build, Execution, Deployment->Console->Python Consoleผมคลิก จากนั้นผมก็เอาออกตัวแปร PYTHONPATH Environment variablesจากสนามบรรดาศักดิ์ หมายเหตุ: ในขณะที่เขียนนี้ฉันใช้ PyCharm 2017.1.2
MikeyE

วิธีนี้ใช้งานได้ แต่ไม่มีการรวมพา ธ ที่รวมไลบรารี Python 2 ของฉันฉันจะทำให้มันทำงานได้ ฉันอยากรู้ว่าทำไม
Ulf Aslak

ใช่ใน windows ฉันรีสตาร์ทพรอมต์ cmd ของฉันมันใช้งานได้บางทีทางอ้อมมันรีเซ็ต PYTHONPATH
Karan Kaw

12

สำหรับฉันข้อผิดพลาดนี้เกิดขึ้นหลังจากติดตั้ง gcloud component app-engine-python เพื่อรวมเข้ากับ pycharm การถอนการติดตั้งโมดูลช่วยได้แม้ว่า pycharm จะไม่ได้อัปโหลดไปยัง app-engine ก็ตาม


4
ฉันได้รับข้อผิดพลาดนี้ในการเรียกใช้ Flask ภายใต้ PyCharm และแก้ไขโดยปิดใช้งานการสนับสนุน AppEngine จากโครงการ (ค่ากำหนด -> ภาษาและกรอบงาน -> Google App Engine) รันไทม์รุ่นที่ 2 สำหรับ Python3 ไม่ใช้เซิร์ฟเวอร์ dev ของเอ็นจิ้นแอปดังนั้นจึงสมเหตุสมผล (สำหรับ Python 2.x)
Brett

9

หากใครก็ตามที่มาที่นี่เนื่องจากได้รับข้อผิดพลาดนี้ในขณะที่รันโปรแกรม google app engine Python 3.7 standard environment project ใน PyCharm สิ่งที่คุณต้องทำก็คือ

  • ตรวจสอบให้แน่ใจว่าการกำหนดค่าที่จะเรียกใช้เป็นของ Flask ไม่ใช่การกำหนดค่า Google App Engine
  • จากนั้นปิดใช้งานการสนับสนุน Google App Engine ภายใต้การตั้งค่า >> ภาษาและกรอบงาน >> Google App Engine

เหตุผลเป็นไปตามลิงค์นี้

เป้าหมายโดยรวมคือแอปของคุณควรพกพาได้อย่างสมบูรณ์และทำงานในสภาพแวดล้อม Python มาตรฐานใดก็ได้ คุณเขียนแอป Python มาตรฐานไม่ใช่แอป App Engine Python จากการเปลี่ยนแปลงนี้คุณไม่จำเป็นต้องใช้ App Engine API และบริการที่เป็นกรรมสิทธิ์ของแอปอีกต่อไป ในขณะนี้ API ของ App Engine ยังไม่พร้อมใช้งานในรันไทม์ Python 3.7

ฉันเดาว่าเมื่อเราสร้างโครงการ python 3.7 ใน PyCharm เป็นโครงการเอ็นจิ้นแอป Google มันยังคงพยายามทำแบบเดียวกับที่ทำกับแอป python2.7


ดังนั้นเมื่อเขียน Google App Engine จาก Pycharm ต้องอัปโหลดโค้ดไปยังระบบคลาวด์ด้วยตนเองไม่เช่นนั้น Pycharm จะยังสามารถอัปโหลดไปยัง App Engine ได้หรือไม่
เบ็น

@ เบ็นฉันไม่แน่ใจว่าคุณหมายถึงอะไรด้วยการอัปโหลดโค้ดไปยังระบบคลาวด์ด้วยตนเอง (Google App Engine) หากคุณกำลังหมายถึงนำไปใช้กับ App Engine gcloud app deployโดยใช้คำสั่ง ที่ไม่มีส่วนเกี่ยวข้องกับ pycharm
โจเซฟอับราฮัม

ฉันเป็นแค่มือสมัครเล่น แต่ฉันคิดว่าการเปิดใช้งานการสนับสนุน App Engine ใน Pycharm ทำให้คุณสามารถใช้คำสั่งเมนูเพื่อปรับใช้โค้ดของคุณได้ แต่เมื่อคุณปิดใช้งานการรองรับเอ็นจิ้นของแอพใน Pycharm (เช่นใช้ Python 3.7) คุณต้องไปที่บรรทัดคำสั่งเพื่อปรับใช้โค้ดของคุณ ฉันมีสิทธิ์นั้นหรือฉันตีความผิดว่าสิ่งที่ App Engine ทำงานภายใต้ 2.7 หรือไม่
เบ็น

@ เบ็นนั่นเป็นเพราะเครื่องมือสนับสนุนเอ็นจิ้นของแอพ Pycharm มีเป้าหมายสำหรับ Python 2.7 ดังที่ฉันได้กล่าวไว้ในคำตอบของฉัน Google ถือว่าแอพเอ็นจิน Python 3.7 Standard App เป็นแอพ Python มาตรฐาน และฉันเชื่อว่านี่เป็นสาเหตุที่ Pycharm ทำงานในลักษณะนี้เช่นกันสำหรับแอพเอ็นจินของแอพ Python 3.7
โจเซฟอับราฮัม

8

การปฏิเสธความรับผิด:โปรด @ juanpa.arrivillaga หากคุณเห็นคำตอบนี้อย่าลังเลที่จะเขียนของคุณเองและฉันจะลบโพสต์นี้

@ juanpa.arrivillaga ได้กล่าวไว้ข้างต้น :

มีชื่อไฟล์ enum.py ในไดเร็กทอรีการทำงานของคุณหรือไม่?

นี่คือปัญหาที่ฉันพบ ฉันไม่ได้ตระหนักถึงโมดูล enum enum.pyบนหลามในเวลาและได้รับการตั้งชื่อไฟล์ทดสอบของฉัน

เนื่องจากชื่อไฟล์เป็นชื่อโมดูลจึงมีข้อขัดแย้ง ข้อมูลเพิ่มเติมเกี่ยวกับโมดูลที่นี่: https://docs.python.org/2/tutorial/modules.html


คุณได้ช่วยชีวิตฉัน
Gastón

6

การปิดใช้งาน "การสนับสนุน Google App Engine" ในการตั้งค่า pycharm ช่วยแก้ปัญหานี้ให้ฉัน

การตั้งค่าเครื่องมือแอป pycharm


ใช้ได้ผลสำหรับฉัน ฉันมีปัญหาเดียวกันกับการเรียกใช้ Flask ในโหมดดีบักจาก PyCharm
Khanh Hua

สิ่งนี้ใช้ได้กับฉัน เพราะจริงๆแล้ว google sdk ใช้ python2 ...
Jose

3

คำตอบของHåken Lid ช่วยแก้ปัญหาของฉันได้ (ขอบคุณ!) ในกรณีของฉันมีอยู่ใน Python3.7 ที่เรียกใช้ Flask ในคอนเทนเนอร์ Docker ( FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7)

ในกรณีของฉันenum34กำลังติดตั้งโดยไลบรารีอื่น ( pip install smartsheet-python-sdk) สำหรับผู้ที่มาพร้อมกับปัญหา Docker container ที่คล้ายกันนี่คือDockerfile สุดท้ายของฉัน (ลอกไปยังบรรทัดที่เกี่ยวข้อง):

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

2

ในกรณีที่คุณต้องเก็บ PYTHONPATH ไว้สำหรับทั้ง python2 และ python3 คุณสามารถเขียนนามแฝงเพื่อตั้งค่า PYTHONPATH ที่เหมาะสมใน bash_profile ของคุณ:

ฮาร์ดโค้ดตัวแปร PYTHONPATH2 และ PYTHONPATH3 ของคุณใน ~ / .bash_profile ของคุณและเพิ่มนามแฝงต่อไปนี้ที่ส่วนท้าย:

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

ของฉันpython(หมายถึง python2) เนื่องจากฉันใช้ python2 บ่อยขึ้น


คำแนะนำนี้ใช้ไม่ได้ ยังคงได้รับข้อผิดพลาดเดียวกัน
Derek

2

เมื่อใดที่ฉันประสบปัญหานี้:

AttributeError: โมดูล 'enum' ไม่มีแอตทริบิวต์ 'IntFlag'

ก่อนอื่นฉันเรียกใช้คำสั่ง:

unset PYTHONPATH 

จากนั้นเรียกใช้คำสั่งที่ฉันต้องการจากนั้นก็ประสบความสำเร็จ


1
นี่เป็นเช่นนั้นเนื่องจาก PYTHONPATH ของคุณต้องชี้ไปที่สิ่งที่เป็นของ python เวอร์ชันเก่าเช่นเดียวกับในกรณีของฉัน มันทำงาน
Nish

Stale VENV ในกรณีของฉัน ขอบคุณสำหรับเคล็ดลับ :)
Janusz Skonieczny

2

การติดตั้ง enum34 เวอร์ชัน 1.1.8 ใช้ได้ผลสำหรับฉัน

ฉันสามารถแก้ไขได้โดยเพิ่ม enum34 = "== 1.1.8" ใน pyproject.toml เห็นได้ชัดว่า enum34 มีคุณลักษณะใน v1.1.8 ที่หลีกเลี่ยงข้อผิดพลาดนี้ แต่สิ่งนี้ถดถอยใน v1.1.9 + นี่เป็นเพียงวิธีแก้ปัญหาเท่านั้น ทางออกที่ดีกว่าคือให้แพ็คเกจใช้เครื่องหมายสภาพแวดล้อมดังนั้นคุณไม่จำเป็นต้องติดตั้ง enum34 เลยเว้นแต่จำเป็น

ที่มา: https://github.com/python-poetry/poetry/issues/1122


1
pyinstallerการแก้ปัญหานี้ทำงานให้ฉันเมื่อพยายามที่จะใช้
Jack Hales

2

ฉันทำได้โดยใช้pip install <required-library> --ignore-installed enum34
เมื่อติดตั้งไลบรารีที่คุณต้องการแล้วให้มองหาคำเตือนระหว่างการสร้าง ฉันได้รับข้อผิดพลาดดังนี้:
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.

pip freeze | grep enum34ในการแก้ไขปัญหานี้ในขณะนี้เรียกใช้คำสั่ง: สิ่งนี้จะให้เวอร์ชันของ enum34 ที่ติดตั้ง ตอนนี้ถอนการติดตั้งโดยpip uninstall enum34และติดตั้งเวอร์ชันที่ต้องการใหม่เป็น
pip install "enum34==1.1.20"


1

ฉันติดตั้ง Python 2 และ Python 3 ไว้ในคอมพิวเตอร์แล้ว ด้วยเหตุผลแปลก ๆ ที่ฉันมีใน sys.path ของ Python 3 ยังเป็นเส้นทางไปยังไดเร็กทอรีไลบรารี sitepackage ของ Python2 เมื่อเรียกใช้โมดูลอีกครั้ง หากฉันรัน Python 3 และอิมพอร์ต enum และprint(enum.__file__)ระบบไม่แสดงพา ธ Python 2 นี้ไปยังไซต์แพ็กเกจ ดังนั้นการแฮ็กที่หยาบและสกปรกมากคือการแก้ไขโมดูลที่นำเข้า enum โดยตรง (ตามเส้นทางการย้อนกลับ) และใส่รหัสต่อไปนี้ก่อนที่จะนำเข้า 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

นั่นช่วยแก้ปัญหาของฉันได้


0

แม้ว่าฉันจะมีปัญหานี้ในขณะที่เรียกใช้ python -m grpc_tools.protoc --version ต้องตั้งค่า PYTHONPATH จนถึงแพ็คเกจไซต์และปิดหน้าต่างพรอมต์คำสั่งทั้งหมดและใช้งานได้ หวังว่าจะช่วยสำหรับผู้ใช้ gRPC


0

ฉันมีปัญหานี้ใน ubuntu20.04 ใน jupyterlab ในเคอร์เนล env เสมือนของฉันพร้อม python3.8 และ tensorflow 2.2.0 ข้อความแสดงข้อผิดพลาดคือ

 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

ปัญหาคือในลิงก์สัญลักษณ์ใน / usr / bin / python ชี้ไปที่ python2 สารละลาย:

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

หวังว่า python2 จะตายเร็ว ๆ นี้! Terveisin, Markus


วิธีนี้อาจทำให้ระบบของคุณยุ่งเหยิงอย่างน่ากลัว! คุณควรใช้ Virtualenv แทนการเปลี่ยน python เริ่มต้นสำหรับทั้งระบบ
Alex Baranowski

ขอบคุณที่ชี้ให้เห็น ฉันยังไม่สังเกตเห็นปัญหาใด ๆ (แต่ฉันมักจะหลีกเลี่ยง python2 ให้มากที่สุด) คนรัก Python2 ไม่ทำแบบนี้แน่นอน
Markus Kaukonen

0

หากคุณมีปัญหานี้เมื่อวิ่งทดสอบในPyCharmให้แน่ใจว่ากล่องที่สองจะไม่ถูกตรวจสอบในการกำหนดค่า


-2

หากใครกำลังมีปัญหานี้เมื่อพยายามเรียกใช้เคอร์เนล Jupyter จาก Virtualenv เพียงเพิ่มที่ถูกต้องPYTHONPATHให้กับเคอร์เนล Virtualenv kernel.jsonของคุณ (ในตัวอย่าง 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"
}
}

ไดเรกทอรีผู้ใช้ของคุณถูกเข้ารหัสไว้ที่นี่ วิธีนี้ใช้ไม่ได้กับมือใหม่: โปรดอธิบายว่ากำลังทำอะไรอยู่และจะหาไฟล์ที่เกี่ยวข้องได้ที่ไหน
Tom Kelly
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.