2016-11-01 49 views
1

我試圖建立一個Python擴展(開局,http://gambit.sourceforge.net/gambit13/build.html)和我得到一個錯誤試圖建立setup.py時:詞典不可寫(通用老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

這似乎是某種類型的(較舊的)setup.py文件的問題。我創建了一個小例子,基於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__ 

其他包在過去也有類似的問題(見Github上arcitc問題#17),顯然是一些Python的魔術去上面我的頭(北極的安裝固定它.py不再包含相關行)。

有什麼想法可能會導致問題?如果是這樣,我可以對setup.py做出任何更改,以避免出現此錯誤而不會破壞底層功能?

回答

0

在舊版本的Python中,它曾經是__dict__類的對象可以更改爲指向不同的字典。隨着新式課程(來自object)的出現,情況發生了變化。您必須在Python 2.x類中明確指定object才能獲得該行爲;在Python 3中,這是標準(也是唯一的)行爲,因爲Python 3根本不支持舊式類。我的猜測是你要使用的模塊是爲Python 2編寫的,並沒有明確從object繼承,並且期望一箇舊式的類,但是因爲Python 3而得到一個新式的類。換句話說,它與Python 3不兼容。

0

這個答案有點沒有經過測試,恐怕。

我認爲@kindall可能正確診斷了這個問題。我認爲解決方案是從https://github.com/gambitproject/gambit/blob/master/src/python/setup.py中刪除違規的4行。

然後你想改變它,以便

#at the top 
from Cython.Build import cythonize 

#at the bottom 

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

http://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html爲用Cython希望如何模塊能夠現已建成。

(我預計會遇到其他Python 3問題)