我正在尝试为我们正在使用的库构建一个简单的 Python 包装器。但奇怪的是这个扩展不适用于官方 Python 构建,只能用于我自己的 Python 构建。即使它们基于相同版本的源代码。我也是 C/C++ 菜鸟,所以我不确定我的程序是否正确。
所以我试图包装的一种方法是这样的(从他们的 SDK 文档中复制):
句法
void IoWrite(IOHANDLE hIo, void * sourceBuffer, long size);
参数
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 的其他应用程序崩溃,但如果我将它与我自己的用 VS 2008 Express 构建的 Python 2.7.5 一起使用,我没有问题。
非常感谢!
有关编译器的其他信息:我使用的是带有 SP1 的 MS Visual C++ 2008 Express Edition,仅此而已。
使用“C:\Python27\python.exe setup.py build”编译