我有一个简单的工作程序,可以从int
函数向num_piezas
函数提交Python
(示例中为C++
)。
Foo.cpp中
#include <iostream>
class Foo{
public:
void bar(int number){
printf("Number is: %d\n", number);
}
};
extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo, int number){ foo->bar(number); }
}
fooWrapper.py
from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def bar(self, num_piezas):
lib.Foo_bar(self.obj, num_piezas)
num_piezas = 5
f = Foo()
f.bar(num_piezas)
问题是现在我想发送一个int
数组和一个char
数组以及该数字。所以我试过了:
Foo.cpp中
#include <iostream>
#include <string.h>
class Foo{
public:
void bar(int number, int piezas[3], char prioridades[3][20]){
printf("Number is: %d\n", number);
for(int i=0;i<3;i++) {
printf("%d", piezas[i]);
}
for(int q=0;q<3;q++) {
printf("%s ", prioridades[q]);
}
}
};
extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo, int number, int piezas[3], char prioridades[3][20]){ foo->bar(number, piezas, prioridades); }
}
fooWrapper.py
from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def bar(self, num_piezas, piezas, prioridades):
lib.Foo_bar(self.obj, num_piezas, piezas, prioridades)
piezas = [1, 2, 3]
prioridades = ['normal', 'baja', 'primera pieza']
num_piezas = 5
f = Foo()
f.bar(num_piezas, piezas, prioridades)
C++
文件正确编译,但是当我尝试执行Python函数(python fooWrapper.py
)时,会显示以下错误消息:
Traceback (most recent call last): File "fooWrapper.py", line 15, in <module> f.bar(num_piezas, piezas, prioridades) File "fooWrapper.py", line 9, in bar lib.Foo_bar(self.obj, num_piezas, piezas, prioridades) ctypes.ArgumentError: argument 3: <type 'exceptions.TypeError'>: Don't know how to convert parameter 3
我做错了什么?我是否需要执行其他操作才能将int
和string
数组作为参数传递?
提前谢谢。
答案 0 :(得分:5)
你可以逃脱这种修改:
from ctypes import c_int, c_char
...
# create a 3-int array
piezas = (c_int*3)()
piezas[0] = 1
piezas[1] = 2
piezas[2] = 3
# create a 3-(20-char array) array
prio = ((c_char*20)*3)()
prio[0].value = "normal"
prio[1].value = "baja"
prio[2].value = "primera pieza"
但是既然你正在处理C ++方面的char数组,我建议你改变你的函数定义:void Bar( int num, char* piezas, int len_piezas, char** prio , int len_prio_elem, int prio);
。它要长得多,但如果要避免缓冲区溢出,则必须控制输入数组的长度。
答案 1 :(得分:1)
您需要使用CFUNCTYPE定义函数原型(阅读文档),然后使用新类型包装您的函数,之后您将获得键入函数。每次要使用带有args的c函数或返回类型不同于int时,都必须这样做。
http://docs.python.org/2/library/ctypes.html#function-prototypes
http://docs.python.org/2/library/ctypes.html#callback-functions
Python列表和c数组是不同的。你可以在python中定义c-array类型,在这里阅读: