当尝试在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用户转发)
澄清:
我正在使用以下setup.py。
from distutils.core import setup; from Cython.Build import cythonize
setup(ext_modules=cythonize("test.pyx"))
但更长的setup.py,例如Saullo Castro建议的那个也没有帮助。
Bounty 授予Saullo Castro指出MinGW-64bit不受支持,即使我最终使用了不同的解决方案。
答案 0 :(得分:3)
我使用的是Windows 7 64位,Python 2.7.5 64位和Cython 0.20.1,您的代码适用于我。
我测试了您的原始代码并且:
def test(int[:] x):
s = np.shape(x)[0]
for i in range(s):
print x[i]
没有问题。我将在这里描述我是如何通过Cython编译的,以及我如何配置我的C编译器与Cython一起使用,希望您可以按照这些步骤解决问题。
下载和Microsoft SDK C编译器according to your Python version
在Windows中配置您的编译环境,对我来说是:
SET DISTUTILS_USE_SDK=1
setenv /x64 /release
编译Cython(只需执行python setup.py
就可以了)
为您的setup.py
文件提供一个不错的.pyx
,此处的示例是我用来支持 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()
答案 1 :(得分:1)
事实证明,最简单的解决方案就是将所有内容切换到32位,因为TDM-GCC 32位工作正常,而且我对64位Python没有任何硬性依赖。