【问题标题】:AttributeError: module 'functools' has no attribute 'wraps'AttributeError:模块 'functools' 没有属性 'wraps'
【发布时间】:2017-01-29 21:51:24
【问题描述】:

我正在尝试使用 Anaconda 4.2 / Python 3.5 测试第 3 方代码当我执行测试时出现以下异常:

Traceback (most recent call last):
  File "pyspark/sql/tests.py", line 25, in <module>
    import subprocess
  File "/home/user/anaconda3/lib/python3.5/subprocess.py", line 364, in <module>
    import signal
  File "/home/user/anaconda3/lib/python3.5/signal.py", line 3, in <module>
    from functools import wraps as _wraps
  File "/home/user/anaconda3/lib/python3.5/functools.py", line 22, in <module>
    from types import MappingProxyType
  File "/home/user/Spark/spark-2.1.0-bin-hadoop2.7/python/pyspark/sql/types.py", line 22, in <module>
    import calendar
  File "/home/user/anaconda3/lib/python3.5/calendar.py", line 10, in <module>
    import locale as _locale
  File "/home/user/anaconda3/lib/python3.5/locale.py", line 108, in <module>
    @functools.wraps(_localeconv)
AttributeError: module 'functools' has no attribute 'wraps'

通常我会假设某些模块正在遮蔽内置模块,但据我所知这不是问题:

  • 我从测试中记录了模块路径 (functools.__file__),它产生了预期的路径。我在异常中得到的路径也没有什么奇怪的。
  • 为了排除可能的模块损坏,我测试了全新的 Anaconda 安装。
  • 当我使用相同的配置和路径从 IPython shell (%run pyspark/sql/tests.py) 执行测试时,问题消失了。
  • functools.wraps 可以在同目录启动的shell中导入,配置相同。
  • 当我用 Python 2 环境替换 Python 3 环境时,问题消失了。
  • 使用virtualenv 创建环境时无法重现问题。

我得到的同一个项目的不同版本:

Traceback (most recent call last):
  File "pyspark/sql/tests.py", line 25, in <module>
    import pydoc
  File "/home/user/anaconda3/lib/python3.5/pydoc.py", line 55, in <module>
    import importlib._bootstrap
  File "/home/user/anaconda3/lib/python3.5/importlib/__init__.py", line 57, in <module>
    import types
  File "/home/user/Spark/spark-1.6.3-bin-hadoop2.6/python/pyspark/sql/types.py", line 22, in <module>
    import calendar
  File "/home/user/anaconda3/lib/python3.5/calendar.py", line 10, in <module>
    import locale as _locale
  File "/home/user/anaconda3/lib/python3.5/locale.py", line 19, in <module>
    import functools
  File "/home/user/anaconda3/lib/python3.5/functools.py", line 22, in <module>
    from types import MappingProxyType
ImportError: cannot import name 'MappingProxyType'

我在这里错过了什么明显的东西吗?

编辑

可用于重现问题的Dockerfile:

FROM debian:latest

RUN apt-get update
RUN apt-get install -y wget bzip2
RUN wget https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh
RUN bash Anaconda3-4.2.0-Linux-x86_64.sh -b -p /anaconda3
RUN wget ftp://ftp.piotrkosoft.net/pub/mirrors/ftp.apache.org/spark/spark-2.1.0/spark-2.1.0-bin-hadoop2.7.tgz
RUN tar xf spark-2.1.0-bin-hadoop2.7.tgz
ENV PATH /anaconda3/bin:$PATH
ENV SPARK_HOME /spark-2.1.0-bin-hadoop2.7
ENV PYTHONPATH $PYTHONPATH:$SPARK_HOME/python/lib/py4j-0.10.4-src.zip:$SPARK_HOME/python
WORKDIR /spark-2.1.0-bin-hadoop2.7
RUN python python/pyspark/sql/tests.py

【问题讨论】:

  • 你的functools.__file__ 是什么?你说你记录了它(我希望你在异常发生的地方记录它,对吗?),当你正常运行它时它会显示什么,当你从 IPython shell 运行它时它会显示什么?
  • @MSeifert 两次都显示相同的路径,这是我在回溯中看到的路径 (/home/user/anaconda3/lib/python3.5/functools.py)。
  • 只是为了排除一个常见错误:您是否尝试从不同的目录调用失败的命令?
  • @MSeifert 我没有成功,我相当有信心在路径上没有松散的functools 模块:/ 我想我一定搞砸了一些大事。老实说,第二个异常让我更加困扰,因为它暗示了一些更广泛的问题(路径上的 Python 2 模块)事情就是代码可以正常工作。
  • 既然您提到它:您的文件夹看起来很奇怪。你有anaconda/lib/pythonx.x/functools.py,而在我的电脑上它是anaconda/lib/functools.py(没有python)。您是否有可能手动在您的 anaconda 发行版中安装了一个 python 发行版,而不是使用您的 anaconda python?

标签: python python-3.x anaconda python-import importerror


【解决方案1】:

我怀疑这是因为 python3functools 模块具有以下导入:from types import MappingProxyType 并且,它不是从 ${CONDA_PREFIX}/lib/python3.5/types.py 获取此模块,而是尝试从 sql 内部导入模块目录:${SPARK_HOME}/python/pyspark/sql/types.pypython2functools 模块没有此导入,因此不会抛出错误。

解决方法是先以某种方式导入 必需 types 模块,然后调用脚本。作为概念证明:

(root) ~/condaexpts$ PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.4-src.zip:$SPARK_HOME/python python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import types
>>> import os
>>> sqltests=os.environ['SPARK_HOME'] + '/python/pyspark/sql/tests.py'
>>> exec(open(sqltests).read())
.....Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
17/01/30 05:59:43 WARN SparkContext: Support for Java 7 is deprecated as of Spark 2.0.0
17/01/30 05:59:44 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

...

----------------------------------------------------------------------
Ran 128 tests in 372.565s

还要注意conda 没有什么特别之处。人们可以在普通的 virtualenv(使用 python3)中看到同样的东西:

~/condaexpts$ virtualenv -p python3 venv
Running virtualenv with interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in venv/bin/python3
Also creating executable in venv/bin/python
Installing setuptools, pip...done.

~/condaexpts$ source venv/bin/activate

(venv)~/condaexpts$ python --version
Python 3.4.3

(venv)~/condaexpts$ python $WORKDIR/python/pyspark/sql/tests.py                                                                                                                                      
Traceback (most recent call last):
  File "/home/ubuntu/condaexpts/spark-2.1.0-bin-hadoop2.7/python/pyspark/sql/tests.py", line 26, in <module>
    import pydoc
  File "/usr/lib/python3.4/pydoc.py", line 59, in <module>
    import importlib._bootstrap
  File "/home/ubuntu/condaexpts/venv/lib/python3.4/importlib/__init__.py", line 40, in <module>
    import types
  File "/home/ubuntu/condaexpts/spark-2.1.0-bin-hadoop2.7/python/pyspark/sql/types.py", line 22, in <module>
    import calendar
  File "/usr/lib/python3.4/calendar.py", line 10, in <module>
    import locale as _locale
  File "/home/ubuntu/condaexpts/venv/lib/python3.4/locale.py", line 20, in <module>
    import functools
  File "/home/ubuntu/condaexpts/venv/lib/python3.4/functools.py", line 22, in <module>
    from types import MappingProxyType
ImportError: cannot import name 'MappingProxyType'

【讨论】:

  • 这是一个合理的解释(我会尝试验证这一点并回复你,我担心不能投票)但让我烦恼的是我无法用标准虚拟环境重现问题。您是否有任何见解与可能导致这种行为的 Anaconda 相比有什么不同?它是错误还是功能? :)
  • @user7487351 我在使用 python3 的 virtualenv 中遇到同样的错误
  • 嗯,现在我可以投票了。但这很奇怪......你得到第二个,而不是AttributeError: module 'functools' has no attribute 'wraps':/
  • 你是对的。重命名types 模块确实可以解决问题。很好的收获,非常感谢。
猜你喜欢
  • 2012-08-30
  • 2018-04-14
  • 2019-02-18
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 2019-07-20
  • 2021-11-05
相关资源
最近更新 更多