从 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_)
   

ma​​in.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 &lt;memory&gt; 指令,是吗? 我检查了现有的 c++ 源文件。没有内存头文件的迹象 还有一件事:你的 main.go 只是运行 python 解释器的 process 并告诉它加载模块 network 然后调用该模块提供的函数,并且这里的全部内容是收集python 进程的输出。因此,我看不出您为什么要尝试使用 cgo 和/或 swig,因为该任务似乎与代码完全无关;你的 Go 代码只不过是调用一个外部进程。为什么不以“正常方式”构建 CPython 模块,然后确保 python 进程找到它? 【参考方案1】:

问题已解决。 .so 放在 /bin 中,Go 编译完成,可以访问网络下的功能

【讨论】:

以上是关于从 Go 调用 CPython 扩展的主要内容,如果未能解决你的问题,请参考以下文章

C# 和 CPython 之间的快速且可扩展的 RPC

内存泄漏,其中 CPython 扩展向 Python 返回一个“PyList_New”实例,该实例永远不会被释放

python调用.net动态库

python调用.net动态库

cpython多进程

深入Cpython (编写一个Cpython 模块)