【问题标题】:Calling a C function from Python generated by SWIG, with char * output从 SWIG 生成的 Python 调用 C 函数,输出为 char *
【发布时间】:2013-05-15 08:45:04
【问题描述】:

我是 SWIG 的新手,如果我的问题已记录在案,请随时发布链接,我会仔细阅读。

我有一个采用以下形式的 C 函数:

int myFunc(char *output, const char *input)

我生成了 Python 包装器,并尝试使用以下方法调用此函数(在 Python 中):

m=""
n="valid input string"
myFunc(m,n)

这只是打印 (int) 返回码,而 m 仍然是 ""。我做错了什么?

谢谢!

【问题讨论】:

  • 我认为您可能需要将m 传递到带有byRef(m) docs.python.org/2/library/ctypes.html#ctypes.byref 的函数中
  • 请记住,Python 中的字符串是不可变的。一旦你用m="" 创建它,你就不能改变它的内容。正如 Haz 建议的那样,您可能需要使用 ctypes 创建一个 char 数组,并将其传递给“byRef”。或者您可以修改 myFunc 以分配一个 char 数组并返回它而不是 int。
  • 只是问一个愚蠢的问题,myFunc() 实际上,做对了吗?您确认它有效吗?

标签: python c types swig


【解决方案1】:

好的,不建议这样做(请参阅我的评论)和 YMMV,但这似乎适用于 Python 2.4:

#pre-allocate enough space for m
m = "\x00"*100
n = "valid input string"
myFunc(m,n)
# now m.rstrip("\x00") has what you want

【讨论】:

    【解决方案2】:

    来自SWIG manual section 8.3.4

    如果你的 C 函数是这样声明的:

    int myFunc(char *myOutput, const char *myInput);
    

    那么你可以使用下面的 SWIG 接口语法:

    %include "cstring.i"
    
    %cstring_bounded_output(char *myOutput, 1024);
    
    int myFunc(char *myOutput, const char *myInput);
    

    这将导致 Python 包装函数采用单个字符串参数 (myInput) 并返回一个整数元组(C 函数的返回值)和一个字符串 (myOutput)。在本例中,字符串的内存将由 SWIG 分配,长度为 1024 字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2023-03-08
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多