我试图在win32上测试一个小的cython模块,但我在构建它时遇到了麻烦。
该文件名为linalg_cython.pyx,包含以下内容:
from __future__ import absolute_import, division, print_function
import numpy as np
cimport numpy as np
import cython
#@cython.boundscheck(False)
#np.ndarray[np.float32]
#@cython.wraparound(False)
def L2_sqrd_float32(np.ndarray hist1, np.ndarray hist2):
""" returns the squared L2 distance
seealso L2
Test:
hist1 = np.random.rand(4, 2)
hist2 = np.random.rand(4, 2)
out = np.empty(hist1.shape, dtype=hist1.dtype)
"""
return (np.abs(hist1 - hist2) ** 2).sum(-1) # this is faster
L2_sqrd = L2_sqrd_float32
我能够通过使用setup.py进行编译,但我不想依赖setup.py来构建扩展。这是因为我还没有完全理解cython编译过程。在开始信任setup.py之前,我想先自己编译它。话虽如此,我通过查看" setup.py build_ext"的输出得到了一个良好的开端:
C:\MinGW\bin\gcc.exe -mdll -O -Wall ^
-IC:\Python27\Lib\site-packages\numpy\core\include ^
-IC:\Python27\include -IC:\Python27\PC ^
-c vtool\linalg_cython.c ^
-o build\temp.win32-2.7\Release\vtool\linalg_cython.o
writing build\temp.win32-2.7\Release\vtool\linalg_cython.def
C:\MinGW\bin\gcc.exe -shared \
-s \
build\temp.win32-2.7\Release\vtool\linalg_cython.o \
build\temp.win32-2.7\Release\vtool\linalg_cython.def \
-LC:\Python27\libs \
-LC:\Python27\PCbuild \
-lpython27 \
-lmsvcr90 \
-o build\lib.win32-2.7\vtool\linalg_cython.pyd
这个创建的pyd文件似乎有用,但我的目标是理解,而不仅仅是让它工作。
复制这种格式(并自己尝试一些事情)我目前正在使用这些命令手动构建所有内容。
C:\Python27\Scripts\cython.exe vtool\linalg_cython.pyx
C:\MinGW\bin\gcc.exe -mdll -O -DNPY_NO_DEPRECATED_API -Wall -Wno-unknown-pragmas
-Wno-format -Wno-unused-function -m32 -shared
-IC:\Python27\Lib\site-packages\numpy\core\include -IC:\Python27\include
-IC:\Python27\PC -IC:\Python27\Lib\site-packages\numpy\core\include
-LC:\Python27\libs -LC:\Python27\PCbuild -lpython27 -lmsvcr90 -o
vtool\linalg_cython.pyd -c vtool\linalg_cython.c
我的命令和setup.py命令之间的主要区别在于我试图在一行中调用gcc而不是将其分成两行。我会在两个命令中调用它,但def文件似乎是由setup.py自动生成的,我不确定它的全部内容。
其内容看似简单:
LIBRARY linalg_cython.pyd
EXPORTS
initlinalg_cython
但在我将命令分成两步并自行生成此def文件之前,我想知道更多关于它的内容。无论哪种方式都不可能在一次调用gcc时创建.pyd?
使用我使用的命令,我能够在正确的位置获取.pyd文件,但是当我尝试导入它时,我得到了
<type 'exceptions.ImportError'>: DLL load failed: %1 is not a valid Win32 application.
这应该是x86 / x64不匹配,因此我尝试添加标志-m32。
总结:当尝试编写一个简单的cython模块时,我的gcc命令给了我32/64位错误。如何修复我的gcc命令,使其生成有效的32位pyd文件。
答案 0 :(得分:0)
你没有提到你的python是32bit还是64bit ..当你尝试在64bit python中导入32bit模块时,通常会发生这种行为,反之亦然。 确保您尝试导入的python和模块是相同的位体系结构。解决这个问题的最简单方法是下载并安装正确的python。