Python ctypes字符指针和字符串长度问题

时间:2014-08-14 12:11:14

标签: python c++ ctypes

问题

我正在尝试编写一个要从python调用的外部库,并希望使用ctypes在python和C ++之间传递信息。为此,我在C ++中定义了一个名为msg的全局变量,并获取我的C ++代码以将消息写入此全局变量。那就是Python可以在需要时读取消息。但是,我似乎遇到了关于此消息长度的限制。

示例代码

这是一些可以重现问题的代码原型。

#include <iostream>
#include <sstream>

std::ostringstream msg;

void internal(){
    msg << " message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message  message ";
}

extern "C"{
    const char* external(){
        internal();
        return msg.str().c_str();
    }
}

msg现在是一个非常长的字符串。我将其保存在名为test.cpp的文件中,并将其编译为共享库:

g++ -c -fPIC test.cpp -o test.o
g++ -shared -Wl,-soname,test.so -o test.so test.o

我现在打开一个python解释器,并执行以下操作

import ctypes
test = ctypes.cdll.LoadLibrary('test.so')
test.external.restype = ctypes.c_char_p

test.external()

输出为'',而不是我在上面构造的超长字符串。

我认为python将从C ++程序接受的消息长度有某种最大值。但是,在我使用的用例中,消息可以是任意长度的。如何确保我能够将消息读入python程序?

如果我用很短的字符串替换长字符串,例如

msg << " message ";

然后一切正常,python解释器输出message

系统信息

Python解释器

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2

g ++编译器

g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2

1 个答案:

答案 0 :(得分:1)

好的,答案是如此明显我很尴尬我起初并没有看到它。 str()方法正在创建一个临时字符串,在internal()方法结束时字符串超出范围后,其指针无效。

以下代码有效:

#include <iostream>
#include <sstream>

std::ostringstream msg;
std::string s;

void internal(){
    for(int i = 0; i < 1000; i++) {
      msg << " message ";
    }
    s = msg.str();
}
extern "C"{
    const char* external(){
        internal();
        return s.c_str();
    }
}