Python3.6在Ubuntu 16.04下调用海康Linux SDK动态库总是失败怎么办?
从海康官网下载的最新版 64 位 sdk,在 py3.6 下用 ctypes 调用 libso 动态库文件,访问 nvr 下的摄像头。。。莫名总是失败,确切说登录成功,但是在 Ubuntu1604 下一调用抓图,就提示抓图失败,失败代码 107 或者 47,同样的代码在 cent6 下可以。。。不知道是系统的锅还是海康 sdk 的锅。。。有踩过坑的 v 友么,给点提示
Python3.6在Ubuntu 16.04下调用海康Linux SDK动态库总是失败怎么办?
2 回复
我遇到类似问题,海康SDK在Ubuntu 16.04上确实有些坑。核心问题是库依赖和Python调用方式。
首先确保SDK基础环境正确:
- 检查
libhcnetsdk.so是否在/usr/lib或通过LD_LIBRARY_PATH指定 - 安装32位兼容库(如果SDK是32位):
sudo apt-get install lib32stdc++6 lib32z1
关键代码示例(使用ctypes正确加载):
import ctypes
import os
# 1. 设置库路径(根据实际位置调整)
os.environ['LD_LIBRARY_PATH'] = '/opt/HikSDK/lib'
# 2. 加载依赖库(按顺序)
ctypes.CDLL('libpthread.so.0', mode=ctypes.RTLD_GLOBAL)
ctypes.CDLL('libcrypto.so.1.0.0', mode=ctypes.RTLD_GLOBAL) # 注意版本
ctypes.CDLL('libssl.so.1.0.0', mode=ctypes.RTLD_GLOBAL)
# 3. 加载海康主库
try:
hik_lib = ctypes.CDLL('/opt/HikSDK/lib/libhcnetsdk.so')
print("SDK加载成功")
except Exception as e:
print(f"加载失败: {e}")
exit(1)
# 4. 定义函数原型(示例:初始化)
NET_DVR_Init = hik_lib.NET_DVR_Init
NET_DVR_Init.restype = ctypes.c_bool
NET_DVR_Init.argtypes = []
if NET_DVR_Init():
print("初始化成功")
else:
print("初始化失败")
常见陷阱:
- Ubuntu 16.04默认OpenSSL版本可能不匹配,需要安装
libssl1.0.0 - 如果报
undefined symbol,尝试在加载主库前先加载libHCCore.so - Python3.6的
ctypes默认编码问题,字符串参数需用ctypes.c_char_p(b"string")
总结:按顺序加载依赖库是关键。
以我多年的经验,基本上都是自己的问题,海康的 libso 动态库,理论上只需要操作系统和架构匹配了就能用。
动态库有可能还依赖其他动态库,可以使用 ldd 命令查看。
访问摄像头,本质上就是访问海康摄像头的 8000 端口,http 连接,所以应该没什么与系统相关的依赖。

