2013-11-01 7 views
0

Я пытаюсь создать простую оболочку Python для библиотеки, которую мы используем. Но странно, что это расширение не работает с официальной сборкой Python, только с моей собственной сборкой Python. Хотя они были основаны на той же версии исходного кода. Я также новичок C/C++, поэтому не уверен, что моя программа верна или нет.Расширение Windows Python C работает только с моей собственной сборкой Python (32-разрядная сборка с использованием VC++ 2008 Express)

Так один из метод, который я пытаюсь обернуть, как это (копируется из их SDK документа):

Синтаксис

недействительным IoWrite (IOHANDLE СМО, аннулируются * sourceBuffer, длинный размер);

Параметры

тио Ручка к сигналу ввода-вывода, то есть значение, возвращаемое из операции IoConnect.

sourceBuffer Параметр, содержащий значение, которое должен иметь IO-сигнал.

размер Размер сигнала для записи.

Возвращаемое значение

Возврат не используется.

Пример кода

IOHANDLE hIoSig; 
long ioVariable = 10; 

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

Вот расширение Python:

#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:

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], 
) 

Если я использую официальный Python построить 2.7 .5, это приведет к сбою некоторых других приложений, которые используют этот SDK, но я не h ave, если я использую его с моим собственным Python 2.7.5, созданным с помощью VS 2008 Express.

Большое спасибо!

Дополнительная информация о компиляторе: Я использовал MS Visual C++ 2008 Express Edition с пакетом обновления 1 (SP1), ничего больше.

my compiler setup

Составлено с использованием "C: \ python27 \ python.exe setup.py строить" My compiler output

+0

Можете ли вы описать, как вы построили расширение. С каким SDK вы связываетесь? Как вы связываете среду выполнения? –

+0

@DavidHeffernan Привет! Я использовал Visual C++ 2008 Express с пакетом обновления 1 (SP1). –

+0

Да. С каким SDK вы связываетесь? Как вы связываете среду выполнения? –

ответ

0

здание из того же исходного кода, вероятно, не достаточно. Все модули Python загружаются в один процесс. Это означает, что базовый Python и все модули должны быть скомпилированы с более или менее одинаковыми параметрами компиляции. Параметры компилятора, которые изменяют поведение кода, могут повлиять на двоичную совместимость скомпилированного кода с другими компиляциями. Кроме того, для разных версий компилятора (или разных компиляторов) могут потребоваться разные параметры компилятора для генерации совместимого кода. Некоторые из этих факторов (компилятор, версия компилятора, используемые параметры компилятора) могут или не могут быть изменены без каких-либо проблем. Если вы не хотите тратить много времени и сил, чтобы узнать, какие факторы важны, обычно лучше использовать один и тот же компилятор, ту же самую версию компилятора, с точно такими же параметрами компилятора.Теперь вы можете добиться этого, скомпилировав все самостоятельно (и, возможно, оставаясь несовместимым с официальной сборкой) или настроив точно ту же среду, что и для официальной сборки.