【问题标题】:Wrapping a C++ library in Python that calls the Python C API在调用 Python C API 的 Python 中包装 C++ 库
【发布时间】:2014-04-10 23:27:40
【问题描述】:

C++ 库使用 SWIG 封装在 Python 中。我们可以在 Python 中实例化一个类,当我们在这个类中调用一个使用 Python C API 的方法时,就会出现这个错误:

致命的 Python 错误:PyThreadState_Get:没有当前线程 中止陷阱:6

如果我们在 C 中调用 Python 之前插入 Py_BEGIN_ALLOW_THREADS,则错误会变成分段错误。

这似乎是 Python 调用 C 调用 Python 的问题,不是吗?有什么想法吗?

【问题讨论】:

  • SWIG 是最新的吗?您是否使用了我们应该知道的任何自定义类型映射?
  • 我使用的是 SWIG 版本 2.0.11 并且没有自定义类型映射
  • 你能发一个SSCCEsscce.org吗?

标签: python c++ c swig


【解决方案1】:

在从 C 调用 python 之前,您需要确保使用 PyGILState_Ensure() 锁定 GIL,并且在调用之后您可以使用 PyGILState_Release() 释放 GIL。更多:

https://docs.python.org/2/c-api/init.html?highlight=gil#PyGILState_Ensure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2011-02-06
    • 2013-01-13
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多