请教 C++ Python 进程间通信

2019-05-14 21:23:03 +08:00
 wisefree

请教各位 V 友一个问题,我正在使用海康威视摄像头,官方给了很全的代码范例,包括 C++、Java、C# 但是没有给出 Python 的,如果用 Python 中的 ctypes 库来调用官方的 DLL,写起来十分的复杂

目前的粗略想法

  1. 用 C++来获取实时的图片
  2. 将获取的图片,交给 Python 来处理

请问大家有合适的方案么?

注:

8452 次点击
所在节点    C
70 条回复
wisefree
2019-05-14 22:58:46 +08:00
@husterqq 这个问题,真让我长见识了,好多库我都不知道,谢啦
xiaoyaocmx
2019-05-14 23:09:36 +08:00
我也遇到过这个问题,考虑过 pybind11,然后用了 zeromq
wisefree
2019-05-14 23:15:31 +08:00
@xiaoyaocmx 这今天也搜到了 zeromq 这个解决方案,你用了 protobuf 了么?
goreliu
2019-05-14 23:17:27 +08:00
@wisefree 搜了下,有很多调 dll 的文章,比如这个:
https://www.ryannn.com/archives/hikvision
看起来不是很麻烦,不如试试,不行的话再进程通信。
dfjslkjdf
2019-05-14 23:28:02 +08:00
sepelf
2019-05-15 07:00:22 +08:00
thrift 了解下
wisefree
2019-05-15 07:41:52 +08:00
@goreliu 简单的用 ctypes 封装,写起来很方便,复杂的回调函数、结构体指针什么的,用 ctypes 容易了。swig,这个方案倒是可以考虑下
wisefree
2019-05-15 07:47:05 +08:00
@sepelf 感谢 :),昨天搜索 gRPC,搜到了这个
wisefree
2019-05-15 07:53:39 +08:00
@wisefree 27 楼,应该是:**用 ctypes 不容易了。**
binux
2019-05-15 08:50:21 +08:00
根据我古老的记忆,ctypes 调不了 C++ 吧,你的封装一次吧
thfurior
2019-05-15 09:05:59 +08:00
ls+1,ctypes 调不了 c++,只能调 c 封装成的 dll/so,我以前搞过用 boost python 封装 c++的 python 库,使用非常方便,楼主不妨试试
Moker
2019-05-15 09:35:26 +08:00
进程通信上共享内存吧 或者把 go 当成粘合剂试下?
sujin190
2019-05-15 09:51:31 +08:00
cython 之前用过,似乎无法完全自动解析 struct 或是 class 提供的指针,不过标准类型比如 char 的支持还是不错的,建议可以写一个 c 文件返回 char 字节流,然后在 python 中导入调用这个函数接收字节流,再用 cython 把 python 文件编译成扩展就行了,性能也不错的,不过我觉得写一个 python 扩展也不难啊
geelaw
2019-05-15 09:59:58 +08:00
也并不非要用网络协议,命名管道就可以。
Yoock
2019-05-15 10:03:43 +08:00
IPC
dinjufen
2019-05-15 10:07:06 +08:00
卧槽,这个我刚做过。我用的 boost/python 库,参见:http://www.pianshen.com/article/5251280159/,在 C++部分将海康摄像头图片转为 Python 直接可用的 PyObject,Python 那边用 opencv-python 直接可用,很方便,就是配置麻烦。不过你说的实时是要延迟多低?我做的延迟 70ms 左右
dinjufen
2019-05-15 10:07:54 +08:00
@dinjufen 链接多了一个逗号和汉字
ipwx
2019-05-15 10:36:22 +08:00
图片用 mmap 或者别的 shared memory 手段直接共享内存,然后依靠 socket/named mutex & inter-process queue 之类的进行协调,这个方案怎么样?
Arnie97
2019-05-15 10:45:01 +08:00
网络协议当然可以,除此之外可以看看这几种比选方案
https://github.com/tleonhardt/Python_Interface_Cpp
zhongchengyong
2019-05-15 10:57:08 +08:00
提供一些新思路:之前使用 Python 调用 C/C++用的是 swig,也看到有使用 CFFI 的。

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

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

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

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

© 2021 V2EX