Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在windows上使用gcc(mingw32)从命令行编译Cython扩展_Python_Windows_Gcc_Mingw_Cython - Fatal编程技术网

Python 在windows上使用gcc(mingw32)从命令行编译Cython扩展

Python 在windows上使用gcc(mingw32)从命令行编译Cython扩展,python,windows,gcc,mingw,cython,Python,Windows,Gcc,Mingw,Cython,我试图在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.wra

我试图在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”的输出,我有了一个良好的开端:

创建的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.
:DLL加载失败:%1不是有效的Win32应用程序。
这应该是x86/x64不匹配,因此我尝试添加标志-m32


总而言之:当尝试组合一个简单的cython模块时,我的gcc命令给了我32/64位的错误。如何修复gcc命令,使其生成有效的32位pyd文件

您没有提到python是32位还是64位。这种行为通常发生在您尝试在64位python中导入32位模块时,反之亦然。 确保您要导入的python和模块是相同的位体系结构。解决这个问题的最简单方法是下载并安装正确的python

<type 'exceptions.ImportError'>: DLL load failed: %1 is not a valid Win32 application.