环境搭建
资源获取
使用限制
安装依赖
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22190359/1655432322314-3807ee44-0802-4824-a9ad-3620ab1ae6af.png#averageHue=%23eeeeee&clientId=u71b08a5a-99ad-4&from=paste&height=202&id=ucae32091&originHeight=404&originWidth=2248&originalType=binary&ratio=1&rotation=0&showTitle=false&size=143963&status=done&style=none&taskId=u43a2c251-97c6-4d82-85b0-1b27671e543&title=&width=1124)
- 原因是缺少pkg-config的依赖,但是安装好了之后运行的时候仍然报错,安装好之后在其目录下找到python3.pc的文件,我进这个目录的时候发现没有该文件,但是有python-3.7.pc文件,我这边直接再把这个文件拷贝到python3.pc文件里问题就解决了
案例用法
- 环境初始化 python3.Py_Initialize() 调用这个方法可以初始化python3的执行环境,只有执行了这个方法才可以运行相关的python3操作,值得注意的是这个方法既没有返回值,也不能重复初始化,重复初始化会报错。这个方法没有返回值意味着我们没法从这个方法中感知它的执行过程是否有问题,但是他也提供了python3.Py_IsInitialized() 这个方法来让我们知道python3的环境是否初始化完成。这两个方法要一起使用
- 添加搜索路径 ,我们要往sys.path中添加我们写的python代码所在的目录作为搜索路径,添加进去之后,文件之中的代码才可以作为一个模块被import进来。值得注意的是,当我们import一个文件的时候,会把这个py脚本的import都会去执行一遍。
- 引入一个模块,PyImport_ImportModule,在python代码里面如果引用不使用的模块不会报错,但是在go调用的时候还会去检查是否有调用,而且会检查你引用包里面的引用是否正确,否则改方法会返回nil
- 根据名字获取模块中的一个变量,GetAttrString,返回的是一个pythonObject,比如我们再a.py中定义了一个demo = 1 那么这个时候我们a.GetAttrString(“demo”)就获取到了这个变量了,当然这里也可以获取一个方法。
- 调用一个方法,Call, 值得注意的是这里的传参是一个tuple。
代码实现
python3.Py_Initialize()
if !python3.Py_IsInitialized() {
fmt.Println("Error initializing the python interpreter")
os.Exit(1)
}
p := "/usr/local/lib/python3.7"
InsertBeforeSysPath(p)
InsertBeforeSysPath("/python/ocr_rec_service")
python3.PySys_SetArgvEx([]string{"python3.7", "/python"}, false)
module := ImportModule("/python/ocr_service/", "ocr_service")
if module == nil {
ptype, pvalue,ptraceback := python3.PyErr_Fetch()
typeInfo := python3.PyUnicode_AsUTF8(ptype.Repr())
fmt.Println("typeinfo: ",typeInfo)
valueInfo := python3.PyUnicode_AsUTF8(pvalue.Repr())
fmt.Println(valueInfo)
tbInfo := python3.PyUnicode_AsUTF8(ptraceback.Repr())
fmt.Println("ptraceback: ",tbInfo)
}
moduleRepr, err := pythonRepr(module)
if err != nil {
return ""
log.Fatalf("moduleRepr is nil")
}
ocrImg := module.GetAttrString("myOcrImage")
args := python3.PyTuple_New(1)
python3.PyTuple_SetItem(args, 0, python3.PyUnicode_FromString(url))
res := ocrImg.Call(args, python3.Py_None)
funcResultStr, _ := pythonRepr(res)
return funcResultStr
遇到的坑
- 发生了错误,获取trackback不到,发现traceback返回的是一个python的一个指针,Python的traceback module提供一整套接口用于提取,比如有traceback.print_tb,在go-python3包中根本就没有traceback模块,致使后期在排查问题上浪费了大量的时间。
![image.png](https://img-blog.csdnimg.cn/img_convert/a71bbd8e471264102481c9eabbfa207d.png#averageHue=#f2f2f2&clientId=u71b08a5a-99ad-4&from=paste&height=349&id=u713fecfc&originHeight=697&originWidth=1500&originalType=binary&ratio=1&rotation=0&showTitle=false&size=313989&status=done&style=none&taskId=u257d5e7c-299a-49d1-ab8b-502a1fa2b5f&title=&width=750)
![image.png](https://img-blog.csdnimg.cn/img_convert/930ea10bb3d4458a90f43ec6554beb49.png#averageHue=#f7f7f7&clientId=u71b08a5a-99ad-4&from=paste&height=390&id=u2539cf27&originHeight=780&originWidth=1966&originalType=binary&ratio=1&rotation=0&showTitle=false&size=124273&status=done&style=none&taskId=ueaebbcbb-5d35-43e7-b4bd-75cc25f9a6b&title=&width=983)
- sys has no attribute ‘args’ 错误,在c中调用python的时候会报错,原因是没导入sys模块执行下面的代码就好了
![截屏2022-06-17 下午4.29.12.png](https://img-blog.csdnimg.cn/img_convert/caad5e7f71ed53b9870eb7f17b4f3c36.png#averageHue=#e1e1e1&clientId=u71b08a5a-99ad-4&from=drop&id=u2c351767&originHeight=64&originWidth=1670&originalType=binary&ratio=1&rotation=0&showTitle=false&size=46383&status=done&style=none&taskId=u87662700-a659-4bcb-a2f1-95873722514&title=)