Расширение Windows Python C работает только с моей собственной сборкой Python (32-разрядная сборка с использованием VC ++ 2008 Express)

0

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

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

Синтаксис

void IoWrite (IOHANDLE hIo, void * sourceBuffer, длинный размер);

параметры

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

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

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

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

Не используется возвращаемое значение.

Пример кода

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 build 2.7.5, это приведет к сбою некоторых других приложений, которые используют этот SDK, но у меня нет проблем, если я использую его с моим собственным Python 2.7.5, созданным с помощью VS 2008 Express.

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

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

Изображение 174551

Скомпилирован с использованием "C:\Python27\python.exe setup.py build" Изображение 174551

  • 0
    Можете ли вы описать, как вы создали свое расширение? С каким SDK вы ссылаетесь? Как вы связываете среду выполнения?
  • 0
    @DavidHeffernan Привет! Я использовал Visual C ++ 2008 Express с пакетом обновления 1 (SP1).
Показать ещё 4 комментария
Теги:
python-extensions

1 ответ

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню