【问题标题】:Why Python 3.6.1 throws AttributeError: module 'enum' has no attribute 'IntFlag'?为什么 Python 3.6.1 抛出 AttributeError:模块 'enum' 没有属性 'IntFlag'?
【发布时间】:2017-08-24 18:52:40
【问题描述】:

我刚刚为 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 呢?

【问题讨论】:

  • 你的工作目录中是否有文件名enum.py
  • /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 在 $PATH 中
  • ...这不是我问的。我问*您的工作目录中是否有一个名为enum.py 的文件
  • 其实是这样。 “确保在你的 shell 配置文件中没有任何地方,PYTHONPATH 设置为指向你的 Python 2.7 安装。”这听起来很可能是造成这种情况的原因。
  • 尝试使用 -I 选项运行解释器以忽略站点包和环境变量和/或使用 -v 查看有关导入的详细消息

标签: python python-3.x enums python-3.6 attributeerror


【解决方案1】:

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

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

【讨论】:

  • 是的,你是对的——这只是给试图同时使用这两种方法的人的一个提示。
  • 就我而言,它给了我Skipping enum34 as it is not installed.. 我使用的是 3.7
  • 如果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.
  • @Rotkiv 解决方案是什么。我也在使用 3.7 并面临同样的问题。
  • @HåkenLid 顺便说一句,当我尝试打开jupyter notebook 时会发生这种情况。
【解决方案2】:

不确定您是否还有这个问题。我有一个类似的问题,我可以通过取消设置 PYTHONPATH 来解决它

$ unset PYTHONPATH

【讨论】:

  • 仅供 PyCharm 用户参考,取消设置 PYTHONPATH 我点击了Settings-&gt;Build, Execution, Deployment-&gt;Console-&gt;Python Console。然后,我从标题为 Environment variables 的字段中删除了 PYTHONPATH 变量。注意:在撰写本文时,我使用的是 PyCharm 2017.1.2。
  • 这行得通,但是如果没有包含我的 Python 2 库的路径组合,我就不能让它工作。我很想知道为什么。
  • 是的,在 Windows 中,我重新启动了我的 cmd 提示符,它起作用了,也许它间接重置了 PYTHONPATH
  • 我至少每周回来一次以查看这个 - 有没有人解释为什么这有效?
【解决方案3】:

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

【讨论】:

  • 我在 PyCharm 下运行 Flask 时遇到此错误,并通过禁用项目中的 AppEngine 支持来修复它(首选项 -> 语言和框架 -> Google App Engine)。 Python3 的第二代运行时不使用应用引擎开发服务器,所以这是有道理的(适用于 Python 2.x)。
【解决方案4】:

如果有人因为在 PyCharm 中运行谷歌应用引擎 Python 3.7 标准环境项目时遇到此错误而来到这里,那么您需要做的就是

  • 确保要运行的配置适用于 Flask,而不是 Google App Engine 配置。
  • 然后在 Preferences >> Languages & Framework >> Google App Engine 下禁用 Google App Engine 支持

原因就是这个link

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

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

【讨论】:

  • 那么,当从 Pycharm 为 Google App Engine 编写代码时,必须手动将他们的代码上传到云端,否则 Pycharm 仍然能够上传到 App Engine?
  • @Ben 我不确定手动将代码上传到云(Google App Engine)是什么意思。如果您指的是使用命令 gcloud app deploy 将其部署到 App Engine。这与pycharm无关。
  • 我只是这方面的业余爱好者,但我认为在 Pycharm 中启用 App Engine 支持使您能够使用菜单命令来部署代码。但是,当您在 Pycharm 中禁用应用程序引擎支持时(即使用 Python 3.7),您需要转到命令行来部署您的代码。我有这个权利还是我误解了应用引擎在 2.7 下的工作方式?
  • @Ben 那是因为 Pycharm 应用引擎支持工具是针对 Python 2.7 的。正如我在回答中提到的那样,Google 将 Python 3.7 标准应用引擎应用程序视为标准 Python 应用程序。我相信这就是 Pycharm 对 Python 3.7 应用引擎应用程序也有这种行为的原因。
【解决方案5】:

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

@juanpa.arrivillaga had mentioned above:

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

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

由于文件名模块名,因此发生了冲突。更多关于模块的信息:https://docs.python.org/2/tutorial/modules.html

【讨论】:

  • 你救了我的命。
【解决方案6】:

安装 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

【讨论】:

  • 当我尝试使用pyinstaller时,这个解决方案对我有用。
  • 信息:将 enum34 更新到 1.1.8 版本的命令“pip install enum34==1.1.8”
【解决方案7】:

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

【讨论】:

  • 为我工作。我在 PyCharm 的调试模式下运行 Flask 时遇到了同样的问题
  • 这对我有用。因为实际上 google sdk 使用 python2 。 ...
【解决方案8】:

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

pip uninstall -y enum34

【讨论】:

  • 用 Python 3.8 解决了我的Linux 5.9.11-3-MANJARO 的问题,同时安装了curtsies
【解决方案9】:

Håken Lid 的回答帮助解决了我的问题(谢谢!),在我的例子中,在 Docker 容器中运行 Flask 的 Python3.7 中存在 (FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.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
...

【讨论】:

    【解决方案10】:

    如果您必须为 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的频率更高。

    【讨论】:

    • 这个建议不起作用;仍然得到同样的错误。
    【解决方案11】:

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

    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
    

    这解决了我的问题。

    【讨论】:

      【解决方案12】:

      当我遇到这个问题时:

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

      首先我运行命令:

      unset PYTHONPATH 
      

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

      【讨论】:

      • 之所以如此,是因为您的 PYTHONPATH 必须指向属于旧版 python 的东西,就我而言。成功了
      • 就我而言是陈旧的 VENV。谢谢你的小费:)
      【解决方案13】:

      我使用pip install &lt;required-library&gt; --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"

      【讨论】:

      【解决方案14】:

      如果您在PyCharm 中运行测试 时遇到此问题,请确保第二个框 在配置中未选中。 p>

      【讨论】:

        【解决方案15】:

        我在带有 python3.8 和 tensorflow 2.2.0 的虚拟 env 内核中的 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 的使用会很快完全下降。

        【讨论】:

        • 这个解决方案会让你的系统变得一团糟!你应该使用 virtualenv 而不是更改整个系统的默认 python。
        • 感谢您指出这一点。我还没有注意到任何问题(但我总是尽可能避免使用 python2)。 Python2 爱好者绝对不应该这样做。
        【解决方案16】:

        即使我在运行 python -m grpc_tools.protoc --version 时也遇到了这个问题 必须将 PYTHONPATH 设置为 site-packages 并关闭所有命令提示符窗口并且它工作。希望对 gRPC 用户有所帮助。

        【讨论】:

          【解决方案17】:

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

          我所做的是

          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
          

          【讨论】:

            【解决方案18】:

            不幸的是,没有任何建议对我有帮助,但经过更多googlingthis

            pip install aenum
            

            帮我解决了

            【讨论】:

              【解决方案19】:

              如果有人在尝试从 virtualenv 运行 Jupyter 内核时遇到此问题,只需将正确的 PYTHONPATH 添加到您的 virtualenv 内核(例如 Python 3)的 kernel.json

              {
               "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"
              }
              }
              

              【讨论】:

              • 您的用户目录在这里是硬编码的。此解决方案不适用于新手:请说明它在做什么以及在哪里可以找到相关文件。
              【解决方案20】:

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

              【讨论】:

              • 这已经在其他答案中提到过 (this one, for example)。 在回答已经有答案的旧问题时,请确保提供新颖的解决方案或显着的解决方案比现有答案更好的解释。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-12-29
              • 2019-03-17
              相关资源
              最近更新 更多