字典不可写(通用旧的setup.py)

时间:2016-11-01 19:49:12

标签: python python-3.x cython

我正在尝试设置Python扩展(Gambit,http://gambit.sourceforge.net/gambit13/build.html),并在尝试构建setup.py时遇到错误:

  

回溯(最近一次呼叫最后一次):文件" setup.py",第32行,< module>

     

m.Extension。 dict = m._Extension。 dict

     

AttributeError:属性' dict ' '类型'对象不可写

这似乎是某种类型的(较旧的)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魔术修复了它(北极的setup.py不再包含相关的行)

对可能导致问题的原因有任何疑问?如果是这样,我是否可以对setup.py进行任何更改以避免此错误而不破坏基础功能?

2 个答案:

答案 0 :(得分:0)

在旧版本的Python中,过去可能会将类的__dict__对象更改为指向不同的字典。随着新式课程(来自object)的出现,这种情况发生了变化。您必须在Python 2.x类中显式指定object才能获得该行为;在Python 3中,这是标准的(也是唯一的)行为,因为Python 3根本不支持旧式类。

我的猜测是你试图使用的模块是为Python 2编写的,没有显式继承自object,并且期望一个旧式的类,但是因为Python而得到一个新式的类换句话说,它与Python 3不兼容。

答案 1 :(得分:0)

这个答案有点未经考验我很害怕。

我认为@kindall可能正确地诊断出了这个问题。我认为解决方案是从https://github.com/gambitproject/gambit/blob/master/src/python/setup.py删除违规的4行。

然后你想改变它

CursorLoader

请参阅http://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html了解Cython如何构建现在的模块。

(我预计会遇到其他Python 3问题)