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

相关内容

  • 没有找到相关文章

最新更新