2013-11-01 1 views
0

사용중인 라이브러리에 대한 간단한 Python 래퍼를 작성하려고합니다. 그러나 이상한 것은이 확장 기능이 공식 Python 빌드에서는 작동하지 않으며, 오직 내 자신의 파이썬 빌드에서만 작동한다는 것입니다. 비록 그들이 소스 코드의 동일한 버전을 기반으로했다. 저는 또한 C/C++ 신인이기 때문에 제 프로그램이 맞는지 확실하지 않습니다.Windows Python C 확장은 내 자신의 Python 빌드 (VC++ 2008 Express를 사용하여 32 비트 빌드)에서만 작동합니다.

그래서 내가 랩을 시도하고있는 방법 중 하나가 이렇게 있습니다 (자신의 SDK 문서에서 복사) :

구문

무효 IoWrite (IOHANDLE HIO, 무효 * sourceBuffer, 롱 사이즈)

파라미터

HIO 입출력 신호로의 핸들의 IoConnect 동작에서, 즉 리턴 값.

sourceBuffer IO 신호가 가져야하는 값을 포함하는 매개 변수입니다.

크기 쓸 신호의 크기.

반환 값

반환 값이 없습니다.

코드 예

IOHANDLE hIoSig; 
long ioVariable = 10; 

hIoSig = IoConnect("IoSigName", sizeof(ioVariable)); 
IoWrite(hIoSig, &ioVariable, sizeof(ioVariable)); 

여기 파이썬 확장이다 :

from distutils.core import setup, Extension 

simio_module = Extension('SimIo', 
         include_dirs = ['Headers', 'Libs'], 
         libraries = ['user32', ], 
         sources = ['SimIoModule.c', 'Libs\SimIoPort.c'], 
         ) 


setup(name = "SimIo", 
    version = "0.1", 
    description = "SimIo", 
    ext_modules = [simio_module], 
) 

나는 공식 파이썬을 사용하는 경우 2.7을 구축 : 여기

#include "Python.h" 
#include <conio.h> 
#include "SimIoPort.h" 

static PyObject * 
ex_IoWrite(PyObject *self, PyObject *args) 
{ 
char *IoPortName; 
long PortValue; 
IOHANDLE hIOsignal; 

if (!PyArg_ParseTuple(args, "si", &IoPortName, &PortValue)) 
{ 
    return NULL; 
} 

hIOsignal = IoConnect(IoPortName, sizeof(PortValue)); 
IoWrite(hIOsignal, &PortValue, sizeof(PortValue)); 

Py_INCREF(Py_None); 
return Py_None; 
} 

static PyMethodDef SimIo_methods[] = { 
    {"io_write", ex_IoWrite, METH_VARARGS, 
    "IoWrite method."}, 
    {NULL, NULL, 0, NULL} 
}; 

PyMODINIT_FUNC 
initSimIo(void) 
{ 
    Py_InitModule("SimIo", SimIo_methods); 
} 

내 setup.py이다가 .5,이 SDK를 사용하는 다른 응용 프로그램이 충돌하지만, VS 2008 Express로 빌드 된 내 자신의 Python 2.7.5와 함께 사용하면 문제가 생깁니다.

고맙습니다.

컴파일러에 관한 추가 정보 : Microsoft Visual C++ 2008 Express Edition SP1 이상을 사용하고 있었지만 그 밖의 것은 없습니다. 사용하여 컴파일 된

my compiler setup

"C를 : \ Python27 \ python.exe를 setup.py 구축"같은 소스 코드에서 My compiler output

+0

확장 기능을 어떻게 구성했는지 설명 할 수 있습니까? 어떤 SDK를 연결하고 있습니까? 런타임을 어떻게 연결하고 있습니까? –

+0

@DavidHeffernan 안녕하세요! Visual C++ 2008 Express with SP1을 사용하고있었습니다. –

+0

예. 어떤 SDK를 연결하고 있습니까? 런타임을 어떻게 연결하고 있습니까? –

답변

0

건물은 아마 충분하지 않습니다. 모든 파이썬 모듈은 단일 프로세스로로드됩니다. 즉, 기본 파이썬과 모든 모듈은 다소 비슷한 컴파일 파라미터로 컴파일되어야합니다. 코드 동작 방식을 변경하는 컴파일러 옵션은 컴파일 된 코드와 다른 컴파일의 이진 호환성에 영향을 줄 수 있습니다. 또한 다른 컴파일러 버전 (또는 다른 컴파일러)은 호환 가능한 코드를 생성하기 위해 다른 컴파일러 옵션이 필요할 수 있습니다. 이러한 요소 (컴파일러, 컴파일러 버전, 사용 된 컴파일러 옵션) 중 일부는 문제없이 변경 될 수도 있고 변경되지 않을 수도 있습니다. 어떤 요소가 중요한지 알기 위해 많은 시간과 노력을 들이지 않으려는 경우, 동일한 컴파일러, 정확히 동일한 컴파일러 옵션을 사용하는 동일한 컴파일러 버전을 사용하는 것이 가장 좋습니다.이제는 모든 것을 스스로 컴파일하고 공식 빌드와 호환되지 않는 상태로 유지하거나 공식 빌드에 사용 된 것과 동일한 환경을 설정하면됩니다.