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

时间:2017-03-30 17:37:01

标签: python-3.x

我刚为MacOS X安装了Python 3.6.1

当我尝试运行控制台(或使用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?

19 个答案:

答案 0 :(得分:97)

这是因为您的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 enum34

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

答案 1 :(得分:64)

不确定您是否还有此问题。我遇到了类似的问题,只需取消设置PYTHONPATH

即可解决问题

$ unset PYTHONPATH

答案 2 :(得分:5)

免责声明:请,@ juanpa.arrivillaga,如果您看到这个答案,请随时自行编写,我将删除此帖。

@ juanpa.arrivillaga had mentioned above

  

工作目录中是否有文件名enum.py?

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

由于文件名模块名称,因此存在冲突。有关模块的更多信息,请访问:https://docs.python.org/2/tutorial/modules.html

答案 3 :(得分:5)

对我来说,此错误是在安装gcloud组件app-engine-python以便集成到pycharm后发生的。即使pycharm现在没有上传到应用引擎,卸载模块也有帮助。

答案 4 :(得分:5)

安装enum34的1.1.8版本对我有用。

我能够通过向pyproject.toml添加enum34 =“ == 1.1.8”来解决此问题。 显然enum34在v1.1.8中具有避免此错误的功能,但是 这在v1.1.9 +中已退回。不过,这只是一种解决方法。的 更好的解决方案是使程序包使用环境标记,以便 除非需要,您根本不需要安装enum34。

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

答案 5 :(得分:3)

HåkenLid的回答帮助解决了我的问题(谢谢!),就我而言,这是在Docker容器(FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.7中运行Flask的Python3.7中实现的。

对于我来说,enum34是由另一个库(pip install smartsheet-python-sdk)安装的。 对于那些遇到类似Docker容器问题的人,这里是 my 最终的Dockerfile(跳至相关行):

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

答案 6 :(得分:2)

如果有人在PyCharm中运行google app引擎Python 3.7标准环境项目时由于遇到此错误而来这里,那么您要做的就是

  • 确保要运行的配置适用于Flask,而不是Google App Engine配置。
  • 然后在“偏好设置” >>“语言和框架” >>“ Google App Engine”下禁用Google App Engine支持

原因符合此link

  

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

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

答案 7 :(得分:2)

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

pip uninstall -y enum34

答案 8 :(得分:2)

如果在PyCharm中运行 tests 时遇到此问题,请确保在配置中取消选中第二个框

答案 9 :(得分: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"

答案 10 :(得分:1)

我在计算机上安装了Python 2和Python 3。出于某种奇怪的原因,当调用re模块时,我在Python 3的sys.path中还有一个指向Python2的sitepackage库目录的路径。如果我运行Python 3并导入enum和print(enum.__file__),则系统不会显示该Python 2站点包路径。因此,一个非常粗暴和肮脏的技巧是直接修改导入枚举的模块(遵循追溯路径),并在导入枚举之前插入以下代码:

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

那解决了我的问题。

答案 11 :(得分:1)

如果必须同时为python2和python3保留PYTHONPATH,则可以编写别名语句以在bash_profile中设置适当的PYTHONPATH:

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

const Set = sequelize.define('Set', 
    {
        id: {
            type: Sequelize.INTEGER, 
            primaryKey: true, 
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING, 
            allowNull: false
        }
    }, 
    {
        tableName: 'sets', 
        timestamps: true, 
        underscored: true
    } 
); 

Set.associate = function(models) {
    Set.belongsTo(
        models.User, 
        {
            as: 'user', 
            foreignKey: { allowNull: false }, 
            onDelete: 'CASCADE'
        }
    )
    Set.hasMany(
        models.Cards, 
        {
            as: 'card', 
            foreignKey: { allowNull: true }, 
            onDelete: 'CASCADE'
        }
    )
}

我的alias python='export PYTHONPATH=${PYTHONPATH2};python' alias python3='export PYTHONPATH=${PYTHONPATH3};python3' (指python2)是因为我更频繁地使用python2。

答案 12 :(得分:1)

在pycharm首选项中禁用“ Google App Engine支持”为我解决了此问题。

pycharm app engine preferences

答案 13 :(得分:0)

我遇到了同样的问题,但我无法更改脚本在其中运行的环境。所以这里的修复不适用于我。

我所做的是

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

答案 14 :(得分:0)

我在使用python3.8和tensorflow 2.2.0的虚拟环境内核中的jupyterlab的ubuntu20.04中遇到了这个问题。错误消息为

 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

希望Python 2的使用将很快完全消失。

答案 15 :(得分:0)

即使我在运行python -m grpc_tools.protoc --version时遇到此问题 必须设置PYTHONPATH直到站点包并关闭所有命令提示符窗口,然后它才能工作。希望它对gRPC用户有所帮助。

答案 16 :(得分:-1)

不幸的是,没有任何建议对我有帮助,但是在googling之后又

pip install aenum

为我解决了

答案 17 :(得分:-1)

每当我遇到这个问题:

  

AttributeError:模块'enum'没有属性'IntFlag'

首先我运行命令:

unset PYTHONPATH 

然后运行我想要的命令,然后成功完成了。

答案 18 :(得分:-2)

如果在尝试从virtualenv运行Jupyter内核时遇到此问题,只需将正确的kernel.json添加到virtualenv内核的{ "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" } } (示例中为Python 3):

df["C"] = df["A"].cumsum()