【问题标题】:Why is the re module trying to import enum.IntFlag?为什么 re 模块试图导入 enum.IntFlag?
【发布时间】:2018-06-01 08:41:54
【问题描述】:

一个核心模块怎么可能从另一个核心模块导入一个不存在的名称?

具体来说,re 模块导入 enum.IntFlag


复制方法

可以通过启动解释器并尝试导入、运行依赖于enum.IntFlag 的程序(例如pip)、在 Eclipse 中查看解释器设置页面、使用文本编辑器、在 PyDev 中运行交互式控制台来重现它, ...

直接导入

from enum import IntFlag

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'IntFlag'

运行依赖程序(pip)

Traceback (most recent call last):
  File "/usr/bin/pip", line 4, in <module>
    import re
  File "/usr/lib/python3.6/re.py", line 142, in <module>
    class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'

在 Eclipse 中查看 Python 解释器设置也会产生上述回溯(在解释器设置所在的窗口中)。

Preferences =:&gt; PyDev =:&gt; Interpreters =:&gt; Python Interpreter

文本编辑器也无法识别打印语句。

另外,当我运行控制台解释器时(例如:Ctrl+Alt+Enter,eclipse 失败并弹出一个显示:

“创建交互式控制台”遇到问题。

初始化控制台时出错。

错误详情

点击错误详情按钮:

Error initializing console.
Unexpected error connecting to console.
Failed to recive suitable Hello response from pydevconsole. Last msg received: Console already exited with value: 1 while waiting for an answer.

Command Line used:  /usr/bin/python3.6 -u /usr/lib/eclipse/../../../home/scott/.eclipse/org.eclipse.platform_4.7.1_155965261_linux_gtk_x86_64/plugins/org.python.pydev_6.2.0.201711281614/pysrc/pydevconsole.py 44633 43575 44633 43575

Environment:
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/cuda/bin:/usr/lib/jvm/default/bin:/opt/jython/bin/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
XAUTHORITY=/tmp/xauth-1000-_0
XDG_DATA_DIRS=/usr/share:/usr/share:/usr/local/share
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_CURRENT_DESKTOP=KDE
QT_AUTO_SCREEN_SCALE_FACTOR=0
MAIL=/var/spool/mail/scott
MOZ_PLUGIN_PATH=/usr/lib/mozilla/plugins
QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
SESSION_MANAGER=local/scott-pc:@/tmp/.ICE-unix/976,unix/scott-pc:/tmp/.ICE-unix/976
LOGNAME=scott
PAM_KWALLET5_LOGIN=/run/user/1000/kwallet5.socket
PWD=/home/scott
XCURSOR_THEME=Azenis
PYPATH=/code/scott/Py/Path
PYTHONPATH=/home/scott/.eclipse/org.eclipse.platform_4.7.1_155965261_linux_gtk_x86_64/plugins/org.python.pydev_6.2.0.201711281614/pysrc/pydev_sitecustomize:/mnt/ssdata/scott/code/Py/Path:/home/scott:/usr/lib/python3.6/Tools/scripts:/usr/lib/python3.6/lib-dynload:/usr/lib/python3.6/site-packages:/usr/lib/python3.6
KDE_SESSION_VERSION=5
SHELL=/bin/bash
KDE_MULTIHEAD=false
KDE_FULL_SESSION=true
GTK_MODULES=canberra-gtk-module
GDK_SCALE=1
DATA=/data/scott/
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session1
PYDYNLOAD=/usr/lib/python3.6/lib-dynload
VM=/vm/scott/
XDG_SESSION_DESKTOP=KDE
SHLVL=1
PYSITE=/usr/lib/python3.6/site-packages
OXYGEN_DISABLE_INNER_SHADOWS_HACK=1
PYVER=3.6
KDE_SESSION_UID=1000
XFILESEARCHPATH=/usr/dt/app-defaults/%L/Dt
LANG=en_GB.UTF-8
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_SESSION_ID=c2
XDG_SESSION_TYPE=x11
DISPLAY=:0
PYTHONSTARTUP=/usr/lib/python3.6/startup_hook.py
GTK_RC_FILES=/etc/gtk/gtkrc:/home/scott/.gtkrc:/home/scott/.config/gtkrc
ECLIPSE_HOME=/usr/lib/eclipse
XDG_SESSION_CLASS=user
XCURSOR_SIZE=56
LIBOVERLAY_SCROLLBAR=0
DESKTOP_SESSION=/usr/share/xsessions/plasma
GDK_CORE_DEVICE_EVENTS=1
USER=scott
GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/scott/.gtkrc-2.0:/home/scott/.config/gtkrc-2.0
XDG_SEAT=seat0
CODE=/code/scott/
GS_LIB=/home/scott/.fonts
PYSCRIPTS=/usr/lib/python3.6/Tools/scripts
NLSPATH=/usr/dt/lib/nls/msg/%L/%N.cat
XDG_VTNR=1
XDG_RUNTIME_DIR=/run/user/1000
HOME=/home/scott
PYTHONIOENCODING=UTF-8
PYDEV_UMD_ENABLED=true
PYDEV_UMD_NAMELIST=guidata,guiqwt
PYDEV_UMD_VERBOSE=true

进展

在标准库版本/usr/lib/python3.6/enum.py, 名称enum.IntFlag 存在于enum.__all__

enum 是从标准库版本导入的吗?

import enum
print(enum.__file__)
# /usr/lib/python3.6/site-packages/enum/__init__.py

它是从/usr/lib/python3.6/site-packages/enum/__init__.py 导入的,我检查了那个文件,没有IntFlag。此外,它是一个包 init 而不是单个文件。

没有/usr/lib/python3.6/site-packages/enum/enum.py。有一个 README 文件说这是 3.4 版。

我可以将__init__.py 的内容替换为enum.py

我可以删除site-packages/enum 目录


解决方案

还有另一个enum 模块,一个python3.4 兼容包,它在标准库中屏蔽了模块版本。

python34兼容包:/usr/lib/python3.6/enum/__init__.py

标准库模块:/usr/lib/python3.6/enum.py.

我删除了目录:

mkdir enumbackup
cd enumbackup
sudo mv /usr/lib/python3.6/enum .
sudo mv /usr/lib/python3.6/enumenum34-1.1.6.dist-info .

现在,enum.__file__ 显示了 /usr/lib/python3.6/enum.py,一切正常。

from enum import IntFlag
## works

感谢您的帮助! :)

【问题讨论】:

  • 您似乎正在尝试编辑您的问题以使其更具主题性,但是您将其变成的内容很容易通过 ctrl-F-ing for enumre docs 中回答.它正在尝试导入enum.IntFlag,因为它需要使用enum.IntFlag。这通常是代码导入东西的原因。
  • @Inversus。您是否检查过您的 python 路径上是否有另一个名为 enum 的模块?这个输出是什么:import enum; print(enum.__file__)?
  • @Inversus。 Python 在 3.4 版中获得了对 enum 的 stdlib 支持。在此之前,enum pypi package 可能已作为依赖项安装。假设 stdlib enum 向后兼容,您可能可以安全地删除站点包版本。
  • @Inversus。你使用什么发行包管理器?我会首先检查它是否安装为您系统上某些其他软件包的依赖项。如果是这样,请使用您的包管理器将其删除;如果没有,请手动将其删除。如果出现问题,您可以随时使用 pip 重新安装。
  • @Inversus。不过,那是一个 python2 包 - 所以你不想碰它。是否有 python3 枚举包?我猜不会,因为您的系统使用的是 python-3.6。

标签: python python-3.x pydev development-environment archlinux


【解决方案1】:

您应该检查在您的 python 路径上是否有另一个名为 enum 的模块隐藏了 stdlib enum 模块。为此,您可以这样做:

import enum
print(enum.__file__)

如果这与python3 stdlib 模块路径不匹配,您应该尝试将其删除。理想情况下,您应该使用系统使用的任何包管理器来卸载它,因为它可能是某个其他包的依赖项。但如果这不可能,您可以尝试手动删除它。

【讨论】:

  • /usr/lib/python3.6/enum/__init__.py 有一个 python3.4 兼容模块,它干扰了/usr/lib/python3.6/enum.py 的标准库模块。手动删除了目录/usr/lib/python3.6/enum/usr/lib/python3.6/enumenum34-1.1.6.dist-info,现在enum.__file__ 按原样显示/usr/lib/python3.6/enum.py,一切正常。当这种情况发生时,我喜欢它。
  • @你拯救了我的一天
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2019-09-21
  • 2020-11-05
相关资源
最近更新 更多