【问题标题】:calling python from golang从 golang 调用 python
【发布时间】:2020-11-07 20:18:25
【问题描述】:

我正在关注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)
 
 }

【问题讨论】:

  • 您好!您能否解释一下为什么包含标签gcccython?这个问题似乎与他们中的任何一个都无关。

标签: python go gcc cython


【解决方案1】:

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

这里是一个自动生成的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 文件应该可以编译。

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2021-11-09
    • 2021-12-31
    • 2015-02-25
    相关资源
    最近更新 更多