【发布时间】: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