RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1421679
Accepted
Universall
Universall
Asked:2022-08-19 06:40:31 +0000 UTC2022-08-19 06:40:31 +0000 UTC 2022-08-19 06:40:31 +0000 UTC

蟒蛇+通过c去

  • 772

最近我对结合 python 和 go 产生了兴趣(例如,加快一些任务)。我找到了几个关于这个主题的网站,但事实证明你需要将它们结合起来c。我寻求帮助:向不知道c在哪里做的人解释ctrl+ c,ctrl+v以便从 python 调用用 go 编写的函数并给出结果。

PS:网站:1、2

python c
  • 1 1 个回答
  • 119 Views

1 个回答

  • Voted
  1. Best Answer
    eri
    2022-08-19T08:18:20Z2022-08-19T08:18:20Z

    功能被打包main。最小 sum.go 看起来像这样:

    package main
    
    import "C"
    
    //export Sum
    func Sum(a, b int) int {
            return a + b
    }
    
    func main() {}
    

    //export Sum该行是必需的,没有它 python 将无法通过 si 看到该函数。

    这样编译:

    go build -o sum.so -buildmode=c-shared sum.go
    

    输出为 sum.so 和 sum.h。有关变量类型,请参见 sum.h。

    对于类型,需要更多细节。该函数如extern GoInt Sum(GoInt a, GoInt b); GoInt上面的定义所示typedef GoInt64 GoInt;,GoInt64已定义为 C 类型long long,在 python 中将 via 转换ctypes.c_longlong为 python int。在这个例子中,没有必要在 python 中指定类型,但是如果你需要传递一些复杂的东西,你将需要它。

    在 python 中,库是通过 ctypes 加载的:

    import ctypes
    
    lib = ctypes.cdll.LoadLibrary("./sum.so")
    lib.Sum.argtypes = [ctypes.c_longlong, ctypes.c_longlong]
    print(lib.Sum(1,3))
    

    使用字符串

    通过 c 字符

    在 Go 中将字符串转换为 C.char

    //export Echo
    func Echo(s *C.char) *C.char {
        return C.CString(
          strings.ToUpper(
            C.GoString(
              s
            )
          )
        )
    }
    

    在python中:

    lib.Echo.argtypes = [ctypes.c_char_p]
    lib.Echo.restype = ctypes.c_char_p
    
    print(lib.Echo('hello'.encode()).decode())
    

    但是在这里我们必须小心,因为通过指针发出的结果不会释放内存。删除指针时,需要检查 Python 是否释放它。

    通过 GoString

    如果你导出一个函数,func Echo(s string) string {return strings.ToUpper(s) }那么这可能会导致 Go 垃圾收集器出现问题,并且在调用时它会因错误而崩溃panic: runtime error: cgo result has Go pointer

    但是传入的字符串可以像这样从python传递

    class GoString(ctypes.Structure):
        "typedef struct { const char *p; ptrdiff_t n; } _GoString_;"
        def __init__(self, s):
            super().__init__(s.encode(), len(s))
    
        def __str__(self):
            return self.p.decode()
    
        _fields_ = [("p", ctypes.c_char_p),
                    ("n", ctypes.c_size_t)]
    
    
    lib.Echo.argtypes = [GoString]
    lib.Echo(GoString('hello'))
    
    • 11

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5