вызов python из golang

#python #go #gcc #cython

#python #Вперед #gcc #cython

Вопрос:

Я следую https://poweruser.blog/embedding-python-in-go-338c0399f3d5 пример использования кода python из приложения golang. Я установил python3.8 dev. Когда я пытаюсь перейти к сборке, я получаю

«неопределенная ссылка на Py_Finalize» есть идеи, почему? Я установил экспорт 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)
 
 }
  

Комментарии:

1. Привет! Не могли бы вы пояснить, почему вы включили теги gcc и cython ? Этот вопрос, похоже, не касается ни одного из них.

Ответ №1:

Я столкнулся с той же проблемой. Оказывается, мой 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, он должен скомпилироваться.