从 c++ 中用 cppyy 读取 char16_t* 字符串
Posted
技术标签:
【中文标题】从 c++ 中用 cppyy 读取 char16_t* 字符串【英文标题】:Read char16_t* String with cppyy from c++ 【发布时间】:2020-05-04 14:06:07 【问题描述】:cppyy 是我发现的唯一一个 Python 包,用于在 Linux 下使用 char16_t* 字符串包装 C++ 库。给定一个函数:
int ::func1(const char16_t* symbol, char16_t* data, const unsigned int length)
// [in] symbol, [out] data, [in] length
// Returns a string "data" of "length" dependent on keyword "symbol"
如何从函数中读取字符串“data”? ctypes-Approach 不起作用:
length = 10
val = ctypes.create_unicode_buffer(length)
cppyy.gbl.func1('Keyname', val, length)
通过文档工作并设法将所有内容都包含在此之外。非常感谢提示。
【问题讨论】:
【参考方案1】:恐怕 cppyy 总是试图将char16_t*
解释为 Python unicode 字符串(包括 BOM 和 Python 的特定编码)而不是将其视为低级数组或外参数.我可能可以修复/改进其中的一些问题,但现在,这里有一个解决方法可以让你超越这一点:
import cppyy
import cppyy.ll
cppyy.cppdef("""
int func1_wrap(const char16_t* symbol, void* data, const unsigned int length)
return func1(symbol, (char16_t*)data, length);
""")
def func1_pywrap(symbol, length):
buf = cppyy.ll.array_new[cppyy.gbl.uint16_t](length)
res = cppyy.gbl.func1_wrap(symbol, buf, length)
return res, cppyy.ll.cast['char16_t*'](buf)
cppyy.gbl.func1 = func1_pywrap
result = cppyy.gbl.func1('Keyname', 5)
print(result)
各种强制转换只是为了让 cppyy 对它正在处理一个 unicode 字符串的事实视而不见,只是让它传递指针。
【讨论】:
别忘了删除数组:cppyy.ll.array_delete(buf)
else: MemoryLeak `以上是关于从 c++ 中用 cppyy 读取 char16_t* 字符串的主要内容,如果未能解决你的问题,请参考以下文章
通过 C++ pythonization 回调将 operator() 的 cppyy 自动映射恢复到 __getitem__
带有 char16_t 或 char32_t 的 Visual Studio C++ 2015 std::codecvt