2016-11-01 9 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が問題を正しく診断した可能性があります。私は解決策は、問題のある4行をhttps://github.com/gambitproject/gambit/blob/master/src/python/setup.pyから削除することだと思います。

あなたがそのように

#at the top 
from Cython.Build import cythonize 

#at the bottom 

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

を、それを変更したいがCythonは、モジュールが現在構築されることを想定方法についてhttp://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.htmlを参照してください。

(私は他のPython 3の問題に遭遇すると予想しています)

関連する問題