初识go-python3

环境搭建

资源获取

使用限制

安装依赖

   ![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 := "/Users/local/lib/python3.7/site-packages"
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)
//python3.Py_Finalize()
        return funcResultStr

遇到的坑

  • 发生了错误,获取trackback不到,发现traceback返回的是一个python的一个指针,Python的traceback module提供一整套接口用于提取,比如有traceback.print_tb,在go-python3包中根本就没有traceback模块,致使后期在排查问题上浪费了大量的时间。

image.png
image.png

  • sys has no attribute ‘args’ 错误,在c中调用python的时候会报错,原因是没导入sys模块执行下面的代码就好了截屏2022-06-17 下午4.29.12.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值