从Python调用C函数(无返回值)

时间:2015-04-28 14:55:44

标签: python c swig

我使用SWIGC++程序与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中调用它时,为什么检查没有返回任何内容?

1 个答案:

答案 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提供更大的库,我强烈建议您查看SWIGBoost Python