Tại sao Python 3.6.1 ném AttributeError: module 'enum' không có thuộc tính 'IntFlag'?


119

Tôi vừa cài đặt Python 3.6.1 cho MacOS X

Khi tôi cố gắng chạy Bảng điều khiển (hoặc chạy bất kỳ thứ gì với Python3), lỗi này sẽ xảy ra:

  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'  

Lớp IntFlag tồn tại trong enum.py. Vì vậy, tại sao AttributeError được ném ra?


8
Có tên tệp nào enum.pytrong thư mục làm việc của bạn không?
juanpa.arrivillaga

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 nằm trong $ PATH
BryanWheelock,

2
... đó không phải là những gì tôi đã hỏi. Tôi hỏi nếu * có một file có tên enum.pytrong của bạn thư mục làm việc
juanpa.arrivillaga

4
Trên thực tế, nó đã được. "Đảm bảo rằng không có nơi nào trong các tệp cấu hình shell của bạn, PYTHONPATH được đặt để trỏ đến cài đặt Python 2.7 của bạn." Điều đó nghe có vẻ rất có thể gây ra điều này.
juanpa.arrivillaga

2
Cố gắng chạy phiên dịch với -Itùy chọn để bỏ qua trang web gói và biến môi trường và / hoặc với -vđể xem verbose thông điệp về nhập khẩu
Ceppo93

Câu trả lời:


229

Đó là vì của bạn enumkhông phải là enummô-đun thư viện tiêu chuẩn . Bạn có thể đã enum34cài đặt gói này .

Một cách để kiểm tra xem có đúng như vậy không là kiểm tra tài sản enum.__file__

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

Vì python 3.6, thư viện enum34 không còn tương thích với thư viện chuẩn. Thư viện cũng không cần thiết, vì vậy bạn có thể gỡ cài đặt nó một cách đơn giản.

pip uninstall -y enum34

Nếu bạn cần mã để chạy trên cả hai phiên bản python <= 3.4 và> 3.4, bạn có thể thử sử dụng enum-compattheo yêu cầu. Nó chỉ cài đặt enum34cho các phiên bản python cũ hơn mà không có enum thư viện tiêu chuẩn.


Điều này giết chết ipython2 --> traitlets --> enum34. (Thật không may, enum34được cài đặt trong .../2.7/site-packages/enumkhông .../2.7/site-packages/enum34- yêu cầu sự cố.)
denis

1
vâng, bạn đúng - đó chỉ là một lưu ý cho bất kỳ ai cố gắng sử dụng cả hai.
denis

9
Trong trường hợp của tôi nó đã cho tôi Skipping enum34 as it is not installed.. Tôi đang sử dụng 3,7
Rotkiv

1
Điều gì nếu print(enum.__file__)mang lại cho tôi điều này: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py. Nó có nghĩa là tôi có một enum thư viện tiêu chuẩn và không enum34? Chỉnh sửa: yeah, pip uninstall enum34đã cho tôiSkipping enum34 as it is not installed.
Andrey

1
@ HåkenLid Điều này xảy ra khi tôi cố gắng mở một jupyter notebook.
Cynthia GS.

89

Không chắc liệu bạn vẫn còn vấn đề này. Tôi đã gặp sự cố tương tự và tôi có thể giải quyết nó đơn giản bằng cách bỏ đặtPYTHONPATH

$ unset PYTHONPATH


2
Chỉ FYI cho người dùng PyCharm, để bỏ đặt PYTHONPATH mà tôi đã nhấp vào Settings->Build, Execution, Deployment->Console->Python Console. Sau đó, tôi đã xóa biến PYTHONPATH khỏi trường có tiêu đề Environment variables. Lưu ý: tại thời điểm viết bài này, tôi đang sử dụng PyCharm 2017.1.2.
MikeyE

Điều này hoạt động, nhưng không có sự kết hợp của các đường dẫn bao gồm các thư viện Python 2 của tôi, tôi có thể làm cho nó hoạt động. Tôi muốn biết tại sao.
Ulf Aslak

Vâng, Trong cửa sổ, tôi khởi động lại tôi cmd nhanh chóng, Nó làm việc, lẽ gián tiếp nó reset PYTHONPATH
Karan Kaw

12

Đối với tôi, lỗi này đã xảy ra sau khi cài đặt thành phần gcloud app-engine-python để tích hợp vào pycharm. Việc gỡ cài đặt mô-đun đã giúp ích, ngay cả khi pycharm hiện không tải lên app-engine.


4
Tôi đã gặp lỗi này khi chạy Flask trong PyCharm và đã khắc phục lỗi này bằng cách tắt hỗ trợ AppEngine từ dự án (Tùy chọn -> Ngôn ngữ & Khung -> Google App Engine). Thời gian chạy thế hệ thứ 2 cho Python3 không sử dụng máy chủ phát triển công cụ ứng dụng nên điều này có ý nghĩa (dành cho Python 2.x).
Brett

9

Nếu bất kỳ ai đến đây vì gặp lỗi này trong khi chạy dự án môi trường tiêu chuẩn Python 3.7 của công cụ ứng dụng google trong PyCharm thì tất cả những gì bạn cần làm là

  • Đảm bảo rằng cấu hình để chạy là cho Flask, không phải cấu hình Google App Engine.
  • Sau đó, tắt hỗ trợ của Google App Engine trong Preferences >> Languages ​​& Framework >> Google App Engine

Lý do là theo liên kết này

Mục tiêu chung là ứng dụng của bạn phải hoàn toàn có thể di động và chạy trong bất kỳ môi trường Python tiêu chuẩn nào. Bạn viết một ứng dụng Python tiêu chuẩn, không phải một ứng dụng Python App Engine. Là một phần của sự thay đổi này, bạn không còn bắt buộc phải sử dụng các dịch vụ và API App Engine độc ​​quyền cho chức năng cốt lõi của ứng dụng của mình. Tại thời điểm này, các API của App Engine không có sẵn trong thời gian chạy Python 3.7.

Tôi đoán khi chúng tôi tạo một dự án python 3.7 trong PyCharm dưới dạng một dự án công cụ ứng dụng của Google, nó vẫn cố gắng thực hiện giống như cách làm đối với ứng dụng python2.7


Vì vậy, khi viết cho Google App Engine từ Pycharm, người ta phải tải mã của họ lên đám mây theo cách thủ công hay Pycharm vẫn có thể tải lên App Engine?
Ben

@Ben Tôi không chắc ý của bạn khi tải mã lên đám mây (Google App Engine) theo cách thủ công. Nếu bạn đang đề cập đến việc triển khai App Engine bằng cách sử dụng lệnh gcloud app deploy. Điều đó không liên quan gì đến pycharm.
Joseph Abraham

Tôi chỉ là một người nghiệp dư trong việc này nhưng tôi nghĩ rằng việc bật hỗ trợ App Engine trong Pycharm đã cho bạn khả năng sử dụng lệnh menu để triển khai mã của mình. Tuy nhiên, khi bạn tắt hỗ trợ công cụ ứng dụng trong Pycharm (tức là để sử dụng Python 3.7), bạn cần phải đi tới dòng lệnh để triển khai mã của mình. Tôi có quyền đó hay tôi đã hiểu sai cách hoạt động của công cụ ứng dụng dưới 2.7?
Ben

@Ben Đó là vì các công cụ hỗ trợ công cụ ứng dụng Pycharm được nhắm mục tiêu cho Python 2.7. Như tôi đã đề cập trong câu trả lời của mình, Google coi các ứng dụng công cụ Ứng dụng tiêu chuẩn Python 3.7 là Ứng dụng Python tiêu chuẩn. Và tôi tin rằng đây là lý do tại sao Pycharm cũng hoạt động theo cách này cho các ứng dụng công cụ ứng dụng Python 3.7.
Joseph Abraham

8

TUYÊN BỐ TỪ CHỐI: Xin vui lòng, @ juanpa.arrivillaga, nếu bạn thấy câu trả lời này, hãy viết cho riêng bạn và tôi sẽ xóa bài đăng này.

@ juanpa.arrivillaga đã đề cập ở trên :

Có tên tệp enum.py trong thư mục làm việc của bạn, tình cờ không?

Đây là vấn đề tôi gặp phải. Tôi không biết về mô-đun enum trên python vào thời điểm đó và đã đặt tên cho tệp thử nghiệm của mình enum.py.

Vì tên tệp tên mô-đun nên đã xảy ra xung đột. Thông tin thêm về các mô-đun tại đây: https://docs.python.org/2/tutorial/modules.html


Bạn đã cứu mạng tôi.
Gastón

6

Việc tắt "Hỗ trợ Google App Engine" trong tùy chọn pycharm đã khắc phục sự cố này cho tôi.

Tùy chọn công cụ ứng dụng pycharm


Làm việc cho tôi. Tôi gặp sự cố tương tự khi chạy Flask ở chế độ gỡ lỗi từ PyCharm
Khánh Hứa

Điều này làm việc cho tôi. Vì thực ra sdk google sử dụng python2. ...
Jose

3

Câu trả lời của Håken Lid đã giúp giải quyết vấn đề của tôi (cảm ơn!), Trong trường hợp của tôi hiện diện trong Python3.7 đang chạy Flask trong vùng chứa Docker ( FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7).

Trong trường hợp của tôi, enum34đã được cài đặt bởi một thư viện khác ( pip install smartsheet-python-sdk). Đối với những người gặp sự cố vùng chứa Docker tương tự, đây là Dockerfile cuối cùng của tôi (được lược bỏ ở các dòng có liên quan):

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

2

Trong trường hợp bạn phải giữ PYTHONPATH cho cả python2 và python3, bạn có thể viết các câu lệnh bí danh để đặt PYTHONPATH thích hợp trong bash_profile của mình:

Mã hóa các biến PYTHONPATH2 và PYTHONPATH3 của bạn trong ~ / .bash_profile của bạn và thêm các bí danh sau vào cuối nó:

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

Của tôi python(đề cập đến python2) vì tôi sử dụng python2 thường xuyên hơn.


Đề xuất này không hoạt động; vẫn bị lỗi tương tự.
Derek

2

Bao giờ tôi gặp vấn đề này:

AttributeError: module 'enum' không có thuộc tính 'IntFlag'

đơn giản trước tiên tôi chạy lệnh:

unset PYTHONPATH 

và sau đó chạy lệnh mong muốn của tôi và sau đó đã thành công.


1
điều này là như vậy bởi vì PYTHONPATH của bạn phải trỏ đến nội dung thuộc phiên bản cũ của python, như trong trường hợp của tôi. Nó đã hoạt động
nish

VENV cũ trong trường hợp của tôi. Thx cho tiền boa :)
Janusz Skonieczny

2

Tôi đã làm bằng cách sử dụng pip install <required-library> --ignore-installed enum34
Sau khi thư viện yêu cầu của bạn được cài đặt, hãy tìm các cảnh báo trong quá trình xây dựng. Tôi gặp lỗi như sau:
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.

Để khắc phục vấn đề này ngay bây giờ hãy chạy lệnh: pip freeze | grep enum34. Điều này sẽ cung cấp cho bạn phiên bản của enum34 đã cài đặt. Bây giờ hãy gỡ cài đặt nó bằng cách pip uninstall enum34và cài đặt lại phiên bản cần thiết như
pip install "enum34==1.1.20"


1

Tôi đã cài đặt Python 2 và Python 3 trên máy tính của mình. Vì một số lý do kỳ lạ, tôi có trong sys.path của Python 3 cũng là một đường dẫn đến thư mục sitepackage library của Python2 khi mô-đun re được gọi. Nếu tôi chạy Python 3 và nhập enum và print(enum.__file__)hệ thống không hiển thị đường dẫn Python 2 này đến các gói trang web. Vì vậy, một cuộc tấn công rất thô bạo và bẩn thỉu là sửa đổi trực tiếp mô-đun mà enum được nhập (theo các đường dẫn theo dõi) và chèn đoạn mã sau ngay trước khi nhập 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

Điều đó đã giải quyết vấn đề của tôi.


1

Tôi đã cài đặt phiên bản 1.1.8 của enum34.

Tôi có thể sửa lỗi này bằng cách thêm enum34 = "== 1.1.8" vào pyproject.toml. Rõ ràng enum34 có một tính năng trong v1.1.8 tránh được lỗi này, nhưng điều này đã thoái lui trong v1.1.9 +. Đây chỉ là một cách giải quyết. Giải pháp tốt hơn sẽ là các gói sử dụng các dấu môi trường để bạn không phải cài đặt enum34 trừ khi cần thiết.

Nguồn: https://github.com/python-poetry/poetry/issues/1122


1
Giải pháp này đã hiệu quả với tôi
Ajith

0

Ngay cả khi tôi gặp sự cố này khi chạy python -m grpc_tools.protoc --version Phải đặt PYTHONPATH cho đến khi các gói trang web và tắt tất cả các cửa sổ nhắc lệnh và nó đã hoạt động. Hy vọng nó sẽ giúp ích cho người dùng gRPC.


0

Tôi đã gặp sự cố này trong ubuntu20.04 trong jupyterlab trong hạt nhân env ảo của mình với python3.8 và tensorflow 2.2.0. Thông báo lỗi là

 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

vấn đề là trong liên kết tượng trưng trong / usr / bin / python đã trỏ đến python2. Giải pháp:

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

Tôi hy vọng python2 sẽ chết sớm! Terveisin, Markus


Giải pháp này có thể làm cho hệ thống của bạn trở nên lộn xộn khủng khiếp! Bạn nên sử dụng virtualenv thay vì thay đổi python mặc định cho toàn hệ thống.
Alex Baranowski

Cảm ơn vì đã chỉ ra điều đó. Tôi vẫn chưa nhận thấy bất kỳ vấn đề nào (nhưng tôi luôn tránh python2 nhiều nhất có thể). Những người yêu thích Python2 chắc chắn không làm điều này.
Markus Kaukonen

0

Nếu bạn có vấn đề này khi chạy kiểm tra trong PyCharm, đảm bảo hộp thứ haikhông được kiểm soát trong các cấu hình.


-2

Nếu bất kỳ ai gặp sự cố này khi cố gắng chạy hạt nhân Jupyter từ virtualenv, chỉ cần thêm đúng PYTHONPATHvào kernel.jsonhạt nhân virtualenv của bạn (ví dụ: 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"
}
}

Thư mục người dùng của bạn được mã hóa cứng ở đây. Giải pháp này sẽ không hoạt động cho người mới: vui lòng giải thích những gì nó đang làm và nơi để tìm các tệp liên quan.
Tom Kelly
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.