我想爲我們正在使用的庫建立一個簡單的Python包裝器。但奇怪的是,這個擴展不適用於官方的Python構建,只能使用我自己的Python構建。儘管它們基於相同版本的源代碼。我也是C/C++新手,所以我不確定我的程序是否正確。Windows Python C擴展只適用於我自己的Python版本(使用VC++ 2008 Express的32位版本)
所以方法,我試圖總結的一個是這樣的(從他們的SDK文檔中複製):
語法
無效IoWrite(IOHANDLE HIO,無效* 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官方建立2.7 .5,它會崩潰一些使用這個SDK的其他應用程序,但我不知道如果我用我自己的Python 2.7.5與VS 2008 Express一起構建的話,它會出現問題。
非常感謝!
有關編譯器的其他信息: 我使用MS Visual C++ 2008 Express Edition SP1,沒有別的。
使用編撰的 「C:\ Python27 \ python.exe setup.py打造」 從相同的源代碼
你能描述你如何構建你的擴展。你連接哪個SDK?你如何鏈接運行時? –
@DavidHeffernan嗨!我正在使用帶有SP1的Visual C++ 2008 Express。 –
是的。你連接哪個SDK?你如何鏈接運行時? –