Python 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 个回答
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();
}
}