Python 调用 C++ 参数包含 vector<double> 类型是不是不行?

210 天前
 SethShi
查了文档, 没看到有对应类型

GPT 给的建议是使用

```
weights = (c_double * 5)(0.3, 0.2, 0.2, 0.15, 0.15)
```

使用 GPT 建议直接返回 Segmentation fault (core dumped) 错误了,
有大神熟悉这方便吗?

****
还有一个问题, 我看 Segmentation fault (core dumped) 会导致程序直接退出, 如果我是一个 web 接口代理调用 so, 崩溃会导致整个程序停止? 有什么好的处理方式吗
2093 次点击
所在节点    Python
24 条回复
sujin190
210 天前
ctypes ? ctypes 似乎没有 vector 的类型映射吧,python 层面想构建出 vector 要求一致内存结构是不是做不到吧,内存结构不对自然 Segmentation fault (core dumped)了

https://stackoverflow.com/questions/49744870/passing-vector-from-a-c-dll-in-python-ctypes
Monad
210 天前
如果想具体 hack 某个版本实现的 vector 没啥问题(毕竟怎么看都是 size+capacity+首地址指针)不过你真的要做这么不兼容的东西吗..
和其他语言交互一律改用 c 接口
SethShi
210 天前
@sujin190 对, ctypes, 一般用什么结构
@Monad 懂了, 直接用 *double 吗?
sujin190
210 天前
@seth19960929 #3 ctypes 只能用 c 标准的数据结构吧,是不是应该用指针,函数也需要声明为 c 导出

weights = (c_double * 5)(0.3, 0.2, 0.2, 0.15, 0.15)这个就是指针吧,Segmentation fault (core dumped)了就是和 vector 要求的内存布局和对其不匹配
qieqie
210 天前
ctypes 只能用 c api ,你需要在接口上把 vector<double>换成 double*和 size_t
Huelse
210 天前
推荐 pybind11 ,有对应的接口和抽象,基本兼容 c++
mightybruce
210 天前
python 无法直接使用 c++ 的数据类型,需要转换为 C 的函数 和结构体, 借助 pybind11, boost.Python 可以实现。
ysc3839
210 天前
不行,或者说极其麻烦,只能写 C++代码对接
ysc3839
210 天前
崩溃问题的话单独用一个进程运行吧,暴露网络接口出来调用。
ysc3839
210 天前
其实看你这种需求,大概适合单独用 C++搭配 cpp-httplib 之类的超级简单的库实现一个 HTTP Server ,通过 HTTP API 把 so 的接口暴露给 Python 使用。崩溃了也能快速重启,不影响主要业务。
leonshaw
210 天前
跨语言一律用 C ,C++ 自己 ABI 都没整统一。
jim9606
210 天前
几乎所有跨语言 interprop 都只能用 c 风格 api,你得写个 wrapper 把 c++的结构转封装成 c 风格的再传递到 cpython
SethShi
210 天前
@Huelse ctypes 用起来简单
@mightybruce 感谢
@ysc3839 #9 那我选择用容器来运行把, 不然另起一个太麻烦了
@leonshaw OK
jones2000
209 天前
直接把 vector 序列化字符串,给 c++,c++再反序列化生成一个 vector.
SethShi
209 天前
@jim9606 好的
@jones2000 会影响效率吧
jones2000
208 天前
@seth19960929 “影响效率”, 具体看你的业务, 如果 c++调用传参数据量很小, 字符串序列化基本不会影响什么效率,
如果传参量大
1. 直接用共享内存, 把 py 数据直接转结构化写入共享内存或共享文件,c++直接读结构化的共享内存数据( memcpy).
2. 通过管道传数据(本机),也可以用 tcp 长连接传数据(可以支持集群模式)
.......
都用 c++写了, 没有什么解决不了的问题。
SethShi
208 天前
@jones2000 #16 现在 C++ 的同事换成 const float* 运行 print 代码了, 但是后续还是会出现 Segmentation fault (core dumped) ,是因为他们代码的原因?
SethShi
208 天前
请问一下, pybind11 生成的 so 和 demo.py 直接运行没问题, 但是放到其它文档导入
SethShi
208 天前
请问一下, pybind11 生成的 so 和 demo.py 直接运行没问题, 有两个问题请大神答复一下
1. 其它文件引入(比如在 fastapi 路由 import 马上报错 ModuleNotFoundError: No module named 'xxx'), 我去 import demo.py 也不行
2. 在 A 机器使用 pybind11 构建出来, 在 B 机器最少需要保留的文件是什么呢


@Huelse
@mightybruce
@sujin190
@Monad
@qieqie
@jones2000
qieqie
208 天前
@seth19960929 vector 还需要一个把 size()传到 c 接口,要不可能访问越界。另外就是注意 vector 本身的作用域,很可能把指针传给你的 python 之后 vector 就析构了。
ModuleNotFound 一般是没有__init__.py 或者用了相对 import 之类的问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1121250

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX