2017-01-29 2 views
3

I 3rd-Party-Code mit Anaconda 4.2/Python 3.5 Wenn ich Tests zu testen, versuche ausführen ich folgende Ausnahme erhalten:Attribute: Modul 'functools' hat kein Attribut 'Wraps'

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' 

Normalerweise würde ich einige davon ausgehen, Modul Shadowing eingebaute Module, aber soweit ich das sagen kann, ist nicht das Problem:

  • I Modulpfad angemeldet (functools.__file__) aus den Tests und es ergibt erwarteten Pfad. Auch gibt es nichts seltsames in dem Weg, den ich in der Ausnahme bekomme.
  • Um mögliche Modulkorruption auszuschließen, habe ich komplett neue Anaconda-Installation getestet.
  • Wenn ich Tests, mit der gleichen Konfiguration und Pfad, von IPython Shell (%run pyspark/sql/tests.py) Problem verschwindet.
  • functools.wraps kann in der Shell importiert werden, die im selben Verzeichnis und mit der gleichen Konfiguration gestartet wurde.
  • Wenn ich Python 3-Umgebung mit Python 2-Umgebung ersetzen, verschwindet das Problem.
  • Das Problem kann nicht reproduziert werden, wenn die Umgebung mit virtualenv erstellt wurde.

Mit anderen Version des gleichen Projekts erhalte ich:

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' 

Gibt es etwas offensichtlich, dass ich hier verpasst?

bearbeiten:

Dockerfile, die verwendet werden können, um das Problem zu reproduzieren:

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 
+0

Was ist deine 'functools .__ file__'? Sie haben gesagt, dass Sie es protokolliert haben (ich hoffe, Sie haben es dort protokolliert, wo die Ausnahme auftritt, richtig?), Was zeigt es, wenn Sie es normal ausführen und was es zeigt, wenn Sie es aus der IPython-Shell ausführen? – MSeifert

+0

@MSeifert Es zeigt den gleichen Pfad beide Male, und es ist der, den ich in tracebacks ('/ home/user/anaconda3/lib/python3.5/functools.py') sehe. – user7487351

+0

nur um einen häufigen Fehler auszuschließen: haben Sie versucht, den fehlgeschlagenen Befehl aus einem anderen Verzeichnis aufzurufen? – MSeifert

Antwort

3

Ich vermute, dies geschieht, weil das functools Modul von python3 die folgenden Import hat: from types import MappingProxyType und statt der Abholung dieses Moduls von ${CONDA_PREFIX}/lib/python3.5/types.py, versucht es das Modul aus dem SQL-Verzeichnis zu importieren: ${SPARK_HOME}/python/pyspark/sql/types.py. Das Modul functools von python2 hat diesen Import nicht und verursacht daher den Fehler nicht.

Um dies zu umgehen, importieren Sie das erforderlichetypes Modul zuerst und rufen Sie dann das Skript auf. Als Proof of Concept:

(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 

Beachten Sie auch, dass es nichts Besonderes conda. Man kann das gleiche in einem normalen virtualenv (mit python3) sehen:

~/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' 
+0

Dies ist plausible Erklärung (Ich werde versuchen, dies zu überprüfen und zu dir zurück, kann nicht upvote Ich habe Angst zu bekommen), aber was mich stört ist, dass ich nicht das Problem mit dem Standard virtuellen Umgebung wiedergeben kann. Haben Sie irgendwelche Einsichten, was ist der Unterschied zu Anaconda, der zu diesem Verhalten führen könnte? Und ist es ein Fehler oder eine Funktion? :) – user7487351

+1

@ user7487351 ich den gleichen Fehler in einem virtualenv mit python3 –

+0

Huh bekommen, jetzt kann ich upvote. Aber das ist seltsam ... Und du bekommst die zweite, nicht 'AttributError: Modul 'functools' hat kein Attribut 'wraps'':/ – user7487351

Verwandte Themen