首页 > 解决方案 > 从 golang 调用 python

问题描述

我正在关注https://poweruser.blog/embedding-python-in-go-338c0399f3d5关于使用来自 golang 应用程序的 python 代码的示例。我安装了python3.8 dev。当我尝试构建时,我得到

“未定义对 Py_Finalize 的引用”知道为什么吗?我已将 export PKG_CONFIG_PATH= 设置为我的 python3.pc 文件所在的位置。

package main
  
 // #cgo pkg-config: python3
  // #include <Python.h>
  import "C"
 
  import (
    "unsafe"
  )
 
 func main() {

   pycodeGo := `
 import sys
 for path in sys.path:
   print(path)
 ` 
   
   defer C.Py_Finalize()
   C.Py_Initialize()
   pycodeC := C.CString(pycodeGo)
   defer C.free(unsafe.Pointer(pycodeC))
   C.PyRun_SimpleString(pycodeC)
 
 }

标签: pythongogcccython

解决方案


我遇到了同样的问题。事实证明,我的python.pc文件没有提供所有必要的标志,即-lpython3.8在该Libs部分中。

python3.pc以下是自动生成的文件示例:

# See: man pkg-config
prefix=/your/dir/path
exec_prefix=${prefix}
includedir=${prefix}/include

Name: Python
Description: Build a C extension for Python
Requires:
Version: 3.8
Libs.private: -lcrypt -lpthread -ldl  -lutil -lm
Libs:
Cflags: -I${includedir}/python3.8 -I${includedir}/x86_64-linux- 
gnu/python3.8

我在本地目录中创建了一个自定义python3.pc文件并更改了PKG_CONFIG_PATH变量以引用新文件。

以下是新文件的示例:

prefix=/your/dir/path
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: GoPython
Description: Embed a python interpreter into go
Requires:
Version: 3.8
Libs.private: -lcrypt -lpthread -ldl -lutil -lm
Libs: -lpython3.8
Cflags: -I${includedir}/python3.8

然后只需运行go build您的 Go 文件即可编译。


推荐阅读