2014-07-25 2 views
1

win32에서 작은 cython 모듈을 테스트하려고하는데 문제가 있습니다.Windows에서 gcc (mingw32) 명령 행에서 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를 사용하여이 컴파일을 얻을 수 있었다, 그러나 나는 설정에 의존해야하고 싶지 않아요. 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 

하지만 난 두 단계로 내 명령을 분할하기 전에이 무엇인지에 대한 자세한 내용을 알고이 데프 자신을 파일을 자동 생성하고 싶습니다 :

그 내용은 간단 보인다. 어느 쪽이든 gcc에 대한 한 번의 호출로 .pyd를 생성 할 수 없습니까? 내가 올바른 장소에서으로 .pyd 파일을 얻을 수있어,하지만 난 그것을 가져 오려고하면 나는 86 있어야하는데

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

을 얻을 사용하고 명령으로

/x64 불일치, 왜 내가 플래그 -m32 추가 시도했다.

요약 : 간단한 cython 모듈을 컴파일하려고 할 때 gcc 명령이 32/64 비트 오류를 ​​표시합니다. 올바른 32 비트 pyd 파일을 생성하도록 gcc 명령을 수정하려면 어떻게합니까?

답변

0

파이썬이 32 비트 또는 64 비트인지는 언급하지 않았습니다.이 종류의 비헤이비어는 일반적으로 64 비트 파이썬에서 32 비트 모듈을 가져 오거나 그 반대로 가져 오려고 할 때 발생합니다. 파이썬과 모듈은 가져 오기를 시도하는 것과 같은 비트 아키텍처인지 확인하십시오. 이것을 수정하는 가장 쉬운 방법은 오른쪽 파이썬을 다운로드하고 설치하는 것입니다.

관련 문제