本文记录debug经验
PyObject* PyImport_ImportModule(const char *name) //Return value: New reference. 返回__import__(name)
使用此API在Go中导入Python的模块。
hello.py:
import numpy import sklearn a=10 def b(xixi): return xixi+"haha" print("calling python success")
将该文件放在helloworld文件夹下,在helloworld文件夹下再创建一个空文件__init__
,于是hello可以作为模块被import。
package main import( "github.com/sbinet/go-python" "fmt" ) func init(){ err :=python.Initialize() if err != nil{ panic(err.Error()) } } var PyStr = python.PyString_FromString // ImportModule will import python module from given directory func ImportModule(dir, name string) *python.PyObject { sysModule := python.PyImport_ImportModule("sys") // import sys path := sysModule.GetAttrString("path") // path = sys.path python.PyList_Insert(path, 0, PyStr(dir)) // path.insert(0, dir) fmt.Println(path) return python.PyImport_ImportModule(name) // return __import__(name) } func main(){ hello:= ImportModule("/opt/py/helloworld","hello") //注意包名hello和文件夹名字helloworld不能一样 if hello == nil{ python.PyErr_Print() fmt.Println("import module error") } fmt.Println(hello) }
总是返回空指针,表明没有import成功。
在确保路径都没错的情况下,调用python.PyErr_Print()
终发现是环境中没有sklearn。
由于我有多个环境,在sys.path中的多个python环境都应该满足所有的依赖要求才行。
得善用API提供的Debug工具呀