2016-11-01 3 views
1

Ich versuche, eine Python-Erweiterung (Gambit, http://gambit.sourceforge.net/gambit13/build.html) einzurichten und eine Störung erhalte, wenn setup.py zu bauen versuchen:Wörterbuch nicht beschreibbar (generic alt setup.py)

Traceback (most recent call last): File "setup.py", line 32, in <module>

m.Extension.dict = m._Extension.dict

AttributeError: attribute 'dict' of 'type' objects is not writable

Dies scheint darauf hinzu ein Problem mit einer bestimmten Art von (älteren) setup.py-Datei sein. Ich habe ein minimales Beispiel basierend auf https://pypi.python.org/pypi/setuptools_cython/0.2:

#Using Python 3.6 on Windows 10 (64-bit) 

from setuptools import setup 
#from distutils.extension import Extension 
#^That line can be included or excluded without changing the error  

import sys 
if 'setuptools.extension' in sys.modules: 
    m = sys.modules['setuptools.extension'] 
    m.Extension.__dict__ = m._Extension.__dict__ 

Andere Pakete haben ähnliche Probleme in der Vergangenheit gehabt haben (siehe arcitc Ausgabe # 17 auf Github) und es anscheinend von einigen Python Magie befestigt, die über meinem Kopf geht (Arktis-Setup .py enthält keine relevanten Zeilen mehr).

Irgendwelche Gedanken darüber, was das Problem verursachen könnte? Wenn ja, gibt es Änderungen, die ich an setup.py vornehmen kann, um diesen Fehler zu vermeiden, ohne die zugrunde liegende Funktionalität zu beeinträchtigen?

Antwort

0

In älteren Versionen von Python war es so, dass das Objekt von Klassen geändert werden konnte, um auf ein anderes Wörterbuch zu zeigen. Das änderte sich mit dem Aufkommen von neuen Klassen (die von object abstammen). Sie müssen object in Python 2.x-Klassen explizit angeben, um dieses Verhalten zu erhalten; In Python 3 ist dies das Standard (und einzige) Verhalten, da Python 3 überhaupt keine Klassen im alten Stil unterstützt.

Meine Vermutung ist, dass das Modul, das Sie verwenden möchten, für Python 2 geschrieben wurde, nicht explizit von object erbt, und erwartet eine Old-Style-Klasse, aber erhält eine neue Stil-Klasse, weil Python 3. In Mit anderen Worten, es ist nicht kompatibel mit Python 3.

0

Diese Antwort ist etwas ungeprüft, fürchte ich.

Ich denke @kindall hat wahrscheinlich das Problem richtig diagnostiziert. Ich denke, die Lösung besteht darin, die anstößigen 4 Zeilen von https://github.com/gambitproject/gambit/blob/master/src/python/setup.py zu entfernen.

Sie wollen dann ändern, so

#at the top 
from Cython.Build import cythonize 

#at the bottom 

setup(
    # some lines skipped 
    ext_modules=cythonize([libgame]), 
    # etc 
    ) 

Siehe http://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html für wie Cython erwartet Module jetzt gebaut werden.

(Ich würde erwarten, in anderen Python 3 Probleme obwohl)

Verwandte Themen