我正在尝试设置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进行任何更改以避免此错误而不破坏基础功能?
答案 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问题)