Python ctypes字符指针和字符串长度问题
Python ctypes character pointer and string length issues
问题
我正在尝试编写一个外部库从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 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
好吧,答案太明显了,我很尴尬,我一开始没有看到它。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();
}
}
相关文章:
- 编译包含字符串的代码时遇到问题
- setlocale的C++土耳其字符串问题
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 我的逻辑反转字符串中的元音有什么问题?
- 按字母顺序对C++问题中的子字符串索引进行分区
- 用户输入字符串的文件附加问题..C++
- 使用 minijson-reader 库读取 JSON 字符串时出现问题
- 在将字符串放入字符串向量时遇到问题?
- 将文件复制到自定义位置,存在字符串转换问题
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 不确定出了什么问题(字符串输入)
- 反向和计数字符串的 C++ 问题
- 反转具有返回值的字符串时出现问题
- C++字符串问题-如何访问字符串元素
- public:静态常量字符串声明/初始化问题
- 在MySql中使用字符串操作函数有什么问题
- Libwesockets.h:lws_write:C++字符串到C的转换和发送问题
- 问题:字符串在另一个字符串上写入
- 日志文件输出的问题-字符串和c_str之间的差异- c++