关键词: python c 混合编程
简介
首先应该明确,tensorrt是c写的,而且是没有开源的。同时其提供的sample中有c++的和python的。这里我们解析一下tensorrt python的使用解析,为什么能调c的部分。
下载tensorrt ,解压之后在lib文件夹下有所有c/c++使用的动态库。可以将路径加入到环境变量:$LD_LIBRARY_PATH。Linux系统就可以发现这些动态库了。
在c/c++使用的时候,只需要相关的头文件和这些动态库就ok了,然后按照官方的例子就可以
2.1 安装python tensorrt
参考我前面的文章
2.2 解析
在import tensorrt as trt
时,做了如下:
import ctypes
import glob
import os
def try_load(library):
try:
ctypes.CDLL(library)
except OSError:
pass
# Try loading all packaged libraries
CURDIR = os.path.realpath(os.path.dirname(__file__))
for lib in glob.iglob(os.path.join(CURDIR, "*.so*")):
try_load(lib)
from .tensorrt import *
__version__ = "7.2.2.3"
import sys
if sys.version_info.major == 2:
print("WARNING: TensorRT Python 2 support is deprecated, and will be dropped in a future version!")
主要是:CURDIR = os.path.realpath(os.path.dirname(__file__))
,也就是采用ctypes载入tensorrt.so
库
然后我们可以看一下tensorrt.so
的链接,采用ldd tensorrt.so
可以看到其链接到了libnvinfer.so.7,libnvonnxparser.so.7 。。。
等tensorrt的库
那这里tensorrt.so
又是什么东西呢?有什么作用呢?这里我们用nm来查看动态库中函数,来大概理解。
nm -D tensorrt.so
有太多东西了。
我们可以用nm -D tensorrt.so | awk '{if($2=="T"){print $3}}'
打印出函数的部分
_fini
_init
PyInit_tensorrt
可以看到这就是c中创建一个python module初始化的函数。所以tensorrt.so
其实就是 tensorrt 使用 python和c实现之间的接口函数。
tensorrt插件的编写之后,编译好新的libnvonnxparser.so.7
解析库之后,替换原来的就ok。
后面具体举例