gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:51:25 24 4
gpt4 key购买 nike

我使用 SWIG 将我的 C++ 程序与 Python 连接起来。我从 cFunctions.py 调用名为 checkValC 函数,如下所示:

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

C头文件(test.h)定义如下:

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]
);

现在我编写了一个测试 Python 代码来调用 C 函数(可从 cFunctions.py 访问)。问题是,当我从我的测试代码 (cFunctions.check(10,20)) 调用“check”时,我到达了它,但它从不返回任何东西!

但是如果我像这样从 cFunctions.py 本身调用 check:

check(10,Trx.a2)

返回结果。我究竟做错了什么?为什么当我从我的 test.py 中调用它时 check 没有返回任何东西?

最佳答案

这有帮助吗?一点谷歌搜索就把我带到了这里!

Calling C functions from Python - By Christian Stigen Larsen

在此处复制以上链接以供引用。 我没有测试此处列出的代码。此外,所有功劳均属于上述链接的作者。

这是一个关于如何从 Python 调用 C 函数的小教程。

让我们用 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 .

关于python - 从 Python 调用 C 函数(无返回值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29922723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com