【发布时间】: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 扩展代码完全无关;你的 Go 代码只不过是调用一个外部进程。为什么不以“正常方式”构建 CPython 模块,然后确保 python 进程找到它?