【发布时间】:2015-04-28 14:55:43
【问题描述】:
我使用SWIG 将我的C++ 程序与Python 连接起来。从 cFunctions.py 我调用名为 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
并且在 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 不返回任何内容?
【问题讨论】:
-
嗯我不确定。在
check的定义中,lib.checkVal(a2,a3,Trx.a4...的前两个参数在没有 Trx 引用的情况下被调用。也许在 cFunctions.py 中,a2 和 a3 被正确定义,但在测试代码中没有。你也从来不使用kulTrxType这是故意的吗? -
谢谢@Bort,这是一个很好的观点,我要试试这个。另外我已经编辑了我的 kulTrxType 问题。