将Python str强制转换为C const char *

时间:2018-07-12 12:16:51

标签: python c python-3.x swig

我刚刚为C .dll启动了一些Python包装程序。并使用SWIG。我遇到了一个问题:来自dll的C函数将const char *的typedef作为参数。我将C语言库的.h包装为以下内容(尝试很多方法使typedef从头文件复制到接口时,真的不知道是否需要这样做):

Added: 
%include "cpointer.i"
%pointer_class(signed char, p_char);

%apply const char * { chararrayiwant }; //not sure if only should be char

Old Code:
%include "typemaps.i"
%include "windows.i"

%module somemodule
%{  #include "someheader.h"
    typedef char chararrayiwant[33];
%}

%include "someheader.h"
typedef char  chararrayiwant[33];

当我尝试像这样在我的Python文件中执行它时:

import mylib as d
...
key = b"somereallylongserialkey"  # type: str
p = ctypes.c_char_p(key)
x = d.myfunc(p, 1, None, None)

我遇到以下错误:

 x = d.myfunc(p, 1, None, None)
TypeError: in method 'myfunc', argument 1 of type 'chararrayiwant const *'

我已经尝试了2天,但没有找到任何解决方案来使它起作用。

谢谢!

P.S:不适用于添加的行

2 个答案:

答案 0 :(得分:1)

我猜您应该将指向字符串的指针传递给myfunc而不是字符串。试试:

p2 = ctypes.addressof(p);
x = d.myfunc(p2, 1, None, None);

第一个函数参数的类型为constchararrayiwant *,类型为char [33] *,类型为char**

答案 1 :(得分:0)

我认为有关双指针char**的答案可能是一个很好的起点。

要考虑的另一件事是包括SWIG模块,该模块允许使用指针,并定义您使用的指针类型,如此处所述:http://www.swig.org/Doc1.3/Library.html

类似这样的东西:

%include "cpointer.i"

/* Create some functions for working with "char *" */
%pointer_functions(char, char_p);

/* A function that uses a "char *" */
void add(int x, int y, char_p *result);

在没有此模块的情况下,SWIG似乎不支持使用指针。