Windows上的Cython内存视图

时间:2014-06-08 19:07:17

标签: python windows cython

当尝试在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用户转发)

澄清:

  • 请再次注意,我使用的是Python 3(实际上,这个bug并没有出现在Python 2中)。
  • 我使用Python 3.4.1和Cython 0.20.1在Conda环境中使用干净安装。
  • 我正在使用以下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不受支持,即使我最终使用了不同的解决方案。

2 个答案:

答案 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一起使用,希望您可以按照这些步骤解决问题。

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没有任何硬性依赖。