gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:37 26 4
gpt4 key购买 nike

问题

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

示例代码

这是一些重现问题的代码原型(prototype)。

#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 解释器输出消息

系统信息

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

最佳答案

好吧,答案很明显,我很尴尬,一开始没看到。 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();
}
}

关于Python ctypes 字符指针和字符串长度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25307762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com