我正在尝试编写一个要从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
答案 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();
}
}