从 Go 调用 CPython 扩展
Posted
技术标签:
【中文标题】从 Go 调用 CPython 扩展【英文标题】:Calling CPython extension from Go 【发布时间】:2021-03-17 16:18:46 【问题描述】:我目前有一个用 C++ 编写并封装到 Python 模块中的源文件(使用 Boost 和 Parser 库)。
我将 go/src 下的 C++ 文件夹和 .so 文件与 main.go 一起移植
程序结构
src
/main
main.go
network.so
/network
file1.cpp (this has a function **object DBdata::getTable())
file1.hpp (#define FILE1_H_)
main.go
package main
// #cgo pkg-config: python3
// #cgo CFLAGS : -I./ -I/usr/include/python3.6
// #cgo LDFLAGS: -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -L/usr/lib -lpython3.6 -lpthread -ldl -lutil -lm
// #include <Python.h>
import "C"
import "fmt"
func main()
cmd := exec.Command("python", "-c", "import network; network.getTable()")
cmd.Dir = "/home/username/go/src/network" //directory where is my python code
out,err := cmd.CombinedOutput()
在构建这个 main.go 之后,我得到的错误是
/usr/include/boost/config/no_tr1/memory.hpp:致命错误:内存:否 这样的文件或目录 > # 包括 > ^~~~~~~~> 编译终止。
如何在 Go 中将 .so 导入为 Python 模块? 这个地方可以用 Swig 吗?
将 Python 模块暴露给 Go 的更好方法是什么?
【问题讨论】:
您是否尝试使用 C 编译器编译您的 C++? @user2357112supportsMonica,我用过 g++ 那么,*.[hc]pp
文件之一具有#include <memory>
指令,是吗?
我检查了现有的 c++ 源文件。没有内存头文件的迹象
还有一件事:你的 main.go
只是运行 python
解释器的 process 并告诉它加载模块 network
然后调用该模块提供的函数,并且这里的全部内容是收集python
进程的输出。因此,我看不出您为什么要尝试使用 cgo
和/或 swig,因为该任务似乎与代码完全无关;你的 Go 代码只不过是调用一个外部进程。为什么不以“正常方式”构建 CPython 模块,然后确保 python 进程找到它?
【参考方案1】:
问题已解决。 .so 放在 /bin 中,Go 编译完成,可以访问网络下的功能
【讨论】:
以上是关于从 Go 调用 CPython 扩展的主要内容,如果未能解决你的问题,请参考以下文章