当尝试在Windows上使用Cython(基于anaconda的安装,使用TDM-GCC,因为我需要支持OpenMP)时,我在使用类型化内存视图时遇到了错误。
test1.pyx
def test(int x): pass
test2.pyx
def test(int[:] x): pass
两个模块都可以用基本的setup.py(使用cythonize)编译,但是导入test1没有问题,导入test2会引发以下问题:
python3 -c "import test2" (<- Note the use of Python3 -- I haven't tried with Python2)
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "stringsource", line 275, in init test2 (test2.c:13146)
UnicodeDecodeError: 'utf-8' codec can't decode byte in position 1: invalid start byte.
在test.c的第13146行没有什么特别的,显然。
这是已知的问题吗?还是我做错了什么?欢迎任何帮助。
(来自Cython-users)
澄清:
- 再次,请注意我使用的是Python 3(事实上,Python 2不会出现这个错误)。
- 我正在使用一个干净的安装到Conda环境,使用Python 3.4.1和Python 0.20.1。
我正在使用下面的setup.py.
from distutils.core import setup; from Cython.Build import cythonize
setup(ext_modules=cythonize("test.pyx"))
但是像Saullo Castro建议的更长的setup.py也没有帮助。
赏金授予Saullo Castro,因为他指出MinGW-64bit不是简单支持的,尽管我最终使用了不同的解决方案。
我使用Windows 7 64位,Python 2.7.5 64位和cyth0.20.1,你的代码为我工作。
我测试了你的原始代码和这个:
def test(int[:] x):
s = np.shape(x)[0]
for i in range(s):
print x[i]
没有问题。我将在这里描述我是如何用Cython编译的,以及我是如何配置我的C编译器来与Cython一起使用的,希望你能按照这些步骤解决你的问题。
根据Python版本下载微软SDK C编译器
在Windows中配置编译环境,对我来说是:
SET DISTUTILS_USE_SDK=1
setenv /x64 /release
编译Cython(简单地做
python setup.py
应该工作)为您的
.pyx
文件提供一个不错的setup.py
,这里遵循我用来启用对OpenMP的支持的示例:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension('test1',
['test1.pyx'],
extra_compile_args=['/openmp', '/O2',
'/favor:INTEL64'])]
setup(name = 'test1',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules)
- 适用时使用
import pyximport; pyximport.install()
事实证明,最简单的解决方案就是将所有内容切换到32位,因为TDM-GCC 32位工作良好,并且我对64位python没有任何硬依赖。