python - 从 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)
}
解决方案
我遇到了同样的问题。事实证明,我的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 文件即可编译。
推荐阅读
- c++ - 如何在 C++ 中逐行读取具有多行的文件?
- android - Android Studio 4.1 图标不可见,如何获取?
- python - 使用 DJANGO 在另一个 HTML 模板的 div 上加载一个 HTML 模板的内容
- javascript - Next.js 粘性导航栏问题在使用 Link 后不会出现
- flutter - 带有 url 更新和超链接支持的 Flutter web 底部导航栏
- r - 如何在 R 中找到与 oneonther 显着不同的行对?
- java - 将 java 转换为 kotlin
- oracle - 在预期以下情况之一时遇到符号“例外”:,
- homebrew - 自制公式安装包
- ibm-mq - 无法启动 IBM MQ 资源管理器获取 java.lang.NoClassDefFoundError