为什么 Python 3.6.1抛出 AttributeError: 模块‘ enum’没有属性‘ IntFlag’?

我刚刚为 MacOSX 安装了 Python 3.6.1

当我尝试运行控制台(或者使用 Python 3运行任何东西)时,会抛出这个错误:

  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 存在于枚举.py 中。那么,为什么要抛出 AttributeError 呢?

160266 次浏览

不确定你是否还有这个问题。我有一个类似的问题,我能够解决它简单地通过取消 PYTHONPATH

$ unset PYTHONPATH

这是因为您的 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,枚举34库不再与标准库兼容。这个库也是不必要的,所以您可以简单地卸载它。

pip uninstall -y enum34

如果需要在 Python 版本 < = 3.4和 > 3.4上运行代码,可以尝试将 enum-compat作为一个需求。它只为没有标准库枚举的旧版本的 python 安装 enum34

免责声明: 请@juanpa. arrivilaga,如果你看到这个答案,请随意写你自己的,我会删除这个帖子。

@ Juanpa. arrivilaga 上面已经提到:

你的工作目录里有没有一个文件名是 enum.py?

这就是我遇到的问题。当时我并不知道 python 上的 enum 模块,而是将我的测试文件命名为 enum.py

由于文件名 模块名称,有一个冲突。更多关于模块的信息在这里: https://docs.python.org/2/tutorial/modules.html

如果任何人在尝试从 viralenv 运行 Jupiter 内核时遇到这个问题,只需将正确的 PYTHONPATH添加到 viralenv 内核的 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"
}
}

Håken Lid 的回答帮助解决了我的问题(谢谢!)在我的案例中,Python 3.7在 Docker 容器(FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7)中运行 Flask。

在我的例子中,enum34是由另一个库(pip install smartsheet-python-sdk)安装的。 对于那些遇到类似 Docker 容器问题的用户,以下是 天啊最终的 Dockerfile (只有相关行) :

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

对于我来说,这个错误发生在安装 gcloud 组件 app-engine-python 之后,目的是为了集成到 pycharm 中。卸载模块会有所帮助,即使 pycharm 现在没有上传到 app-engine。

我的电脑上安装了 Python 2和 Python 3。出于某种奇怪的原因,当 re 模块被调用时,Python 3的 sys.path 中还有一个到 Python 2的 sitepackage 库目录的路径。如果我运行 Python3并导入 enum 和 print(enum.__file__),系统不会显示这个 Python2到站点包的路径。因此,一个非常粗糙的方法是,直接修改导入 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

这解决了我的问题。

如果有人因为在 PyCharm 中运行 google app engine Python 3.7标准环境项目时出现这个错误而来到这里,那么您需要做的就是

  • 确保运行的配置是 Flask,而不是 Google 应用 engine configuration。
  • 然后在首选项 > > 语言和框架 > > Google App Engine 下禁用 Google App Engine 支持

原因是根据这个 链接

总体目标是您的应用程序应该是完全可移植的,并且可以在任何标准 Python 环境中运行。您编写的是标准的 Python 应用程序,而不是 App Engine Python 应用程序。作为这一转变的一部分,您不再需要为您的应用程序的核心功能使用专有的 App Engine API 和服务。目前,在 Python 3.7运行时中还没有 App Engine API。

我猜想,当我们在 PyCharm 中创建一个 python 3.7项目作为 Google 应用程序引擎项目时,它仍然会尝试采用与 python2.7应用程序相同的方式

如果必须为 python2和 python3保留 PYTHONPATH,可以编写别名语句来在 bash _ profile 中设置适当的 PYTHONPATH:

在 ~/. bash _ profile 中对 PYTHONPATH2和 PYTHONPATH3变量进行硬编码,并在其末尾添加以下别名:

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

我的 python(指 python2)因为我经常使用 python2。

每当我遇到这个问题:

AttributeError: 模块‘ enum’没有属性‘ IntFlag’

首先我运行命令:

unset PYTHONPATH

然后运行我想要的命令,然后获得成功。

禁用“谷歌应用程序引擎支持”的魅力首选项为我修复了这个问题。

pycharm app engine preferences

即使是我在运行 python-m grpc _ tools. protocol —— version 时也有这个问题 必须设置 PYTHONPATH 直到站点包和关闭所有命令提示窗口,它工作。希望对 gRPC 用户有所帮助。

安装枚举34的1.1.8版本对我来说很有用。

我可以通过向 pyproject.toml 添加枚举34 = “ = = 1.1.8”来解决这个问题。 显然,枚举34在 v1.1.8中有一个特性避免了这个错误,但是 这在 v1.1.9 + 中倒退了。这只是一个变通方案 更好的解决方案是让软件包使用环境标记 除非需要,否则根本不需要安装枚举34。

资料来源: https://github.com/python-poetry/poetry/issues/1122

在 jupyterlab 的 ubuntu20.04中,我在使用 python3.8和 tensorflow 2.2.0的虚拟 env 内核中遇到了这个问题。错误信息是

 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的使用率很快就会完全下降。

我用的是 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。这将为您提供已安装的枚举34的版本。现在通过 pip uninstall enum34卸载它并重新安装所需的版本,如 < br > pip install "enum34==1.1.20"

如果在 PyCharm中运行 测试时遇到此问题,请确保配置中的 第二个盒子不受约束

不幸的是,没有一个建议对我有帮助,但在一些更多的 谷歌一下

pip install aenum

帮我解决了

我在从 HuggingFace 安装 transformers库时遇到了这个问题。这是因为在我的环境中安装了 enum34包,它覆盖了 Python 中的内置枚举。这个软件包可能是为了向前兼容性而安装的,而 Python 3.6 + 不再需要这种兼容性。所以解决办法很简单,

pip uninstall -y enum34

我遇到了同样的问题,但是我不能改变运行脚本的环境。所以这里的修正不适用于我。

我所做的是

import os
import sys
os.environ["PYTHONPATH"] = os.pathsep.join(
(p for p in os.environ["PYTHONPATH"].split(os.pathsep) if "python2" not in p)
)
sys.path = [p for p in sys.path if "python2" not in p]


# Now that the paths are clean, we can import re
import re

确保代码库中没有名为 enum 的文件或文件夹

2022年最新情况

如果您使用的是 Python 的现代版本(在我的例子中是3.9.x) ,那么根本不需要“枚举34”,因为这个库被描述为“ Python 3.4 Enum 回移到3.3、3.2、3.1、2.7、2.6、2.5和2.4”

所以对我来说,解决办法就是彻底摆脱它:

pip uninstall enum34

现在 Pycharm 完美地运行了我的应用程序。

我的问题是,我将我的一个目录标记为 pycharm 中的 Test Sources Root,这导致 python ast包在 <my_test_src_root_dir>/__init__.py中查找 enum(它是空的)。我发现这一点是通过点击抛出的行,然后控制(mac CMD-B)到 enum包,并看到它到标记目录的 __init__.py文件。

抛出的文件:

“/opt/homebrew/Cellar/python@3.10/3.10.2/Frances/Python.Framework/Versions/3.10/lib/python3.10/ast.py”

这句话的意思是:

from enum import IntEnum, auto

错误是:

Import Error: 无法从‘ enum’(.../path/to/_ Init _. py)导入名称‘ IntEnum’