我使用SWIG
将C++
程序与Python
连接起来。从cFunctions.py
开始,我调用名为C
的{{1}}函数,如下所示:
checkVal
在C头文件(lib = cdll.LoadLibrary('./test.so')
xml_bytesTrx = bytearray(b'<xml>...</xml>')
a1 = (ctypes.c_byte*513)(*xml_bytesTrx)
class EFT_TRX(Structure):
_fields_ = [
("a2",c_ulong),
("a3",c_char*16),
("a4",c_char*4),
("a5",c_ushort),
("a6",c_char*41),
("a7",c_char*13),
("a8",c_char*21),
("a1",c_byte*513)
]
Trx = EFT_TRX(0,"0",'CHF',0,'4506445638161117',"123456123456","202020",
a1)
def check(arg1, arg2):
eftTransactionRes = lib.checkVal(arg1,arg2,Trx.a4,Trx.a5,
Trx.a6,Trx.a7,Trx.a8,
Trx.a1)
Trx.a3 = arg2
return eftTransactionRes
)中定义如下:
test.h
现在我编写了一个测试Python代码来调用C函数(可以从long TEST_API checkVal(
_IN____ const unsigned long a2,
_INOUT_ char a3[16],
_IN____ const char a4[4],
_IN____ const unsigned short a5,
_IN____ const char a6[41],
_IN____ const char a7[13],
_IN____ const char a8[21],
_INOUT_ char a1[513]
);
访问)。问题是,当我打电话给&#34;检查&#34;从我的测试代码(cFunctions.py
)我到达它,但它永远不会返回任何东西!
但如果我在cFunctions.check(10,20)
内调用check
就像这样:
cFunctions.py
返回结果。我究竟做错了什么?当我从test.py中调用它时,为什么检查没有返回任何内容?
答案 0 :(得分:1)
这有帮助吗?一个小小的谷歌搜索引领我来到这里!
Calling C functions from Python - By Christian Stigen Larsen
在此处复制以上链接以供参考。 我还没有测试过此处列出的代码。此外,所有赠金均归上述链接的作者所有。
这是一个关于如何从C
调用Python
函数的小教程。
让我们在C中制作一些简单的函数。我们将调用文件
<强> mymodule.c的强>
#include <Python.h>
/*
* Function to be called from Python
*/
static PyObject* py_myFunction(PyObject* self, PyObject* args)
{
char *s = "Hello from C!";
return Py_BuildValue("s", s);
}
/*
* Another function to be called from Python
*/
static PyObject* py_myOtherFunction(PyObject* self, PyObject* args)
{
double x, y;
PyArg_ParseTuple(args, "dd", &x, &y);
return Py_BuildValue("d", x*y);
}
/*
* Bind Python function names to our C functions
*/
static PyMethodDef myModule_methods[] = {
{"myFunction", py_myFunction, METH_VARARGS},
{"myOtherFunction", py_myOtherFunction, METH_VARARGS},
{NULL, NULL}
};
/*
* Python calls this to let us initialize our module
*/
void initmyModule()
{
(void) Py_InitModule("myModule", myModule_methods);
}
在Mac OS X上编译动态库与您可能习惯的常用gcc -shared不同:
gcc -dynamiclib -I/usr/include/python2.3/ -lpython2.3 -o myModule.dylib myModule.c
现在你必须做一些尴尬的事情;将myModule.dylib重命名为myModule.so,以便Python找到正确的文件(这是Python中的一个错误,它应该已经修复,但据我所知):
mv myModule.dylib myModule.so
如果您使用的是支持-shared的系统,您可以直接执行此操作:
gcc -shared -I/usr/include/python2.3/ -lpython2.3 -o myModule.so myModule.c
在Windows上,您可以报告输入
gcc -shared -IC:\Python27\include -LC:\Python27\libs myModule.c -lpython27 -o myModule.pyd
这是一个用Python调用函数的简单程序:
from myModule import *
print "Result from myFunction:", myFunction()
print "Result from myOtherFunction(4.0, 5.0):", myOtherFunction(4.0, 5.0)
输出结果为:
Result from myFunction(): Hello from C!
Result from myOtherFunction(4.0, 5.0): 20.0
如果您打算使用Python提供更大的库,我强烈建议您查看SWIG或Boost Python。