#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, он должен скомпилироваться.