【问题标题】:Calling Python functions from C++从 C++ 调用 Python 函数
【发布时间】:2011-05-18 21:52:43
【问题描述】:

我正在尝试从 C++ 中调用 Python 函数。我以为可以通过函数指针来实现,但似乎不可能。我一直在使用boost.python 来完成此操作。

假设在 Python 中定义了一个函数:

def callback(arg1, arg2):
    #do something
    return something

现在我需要将此函数传递给 C++,以便可以从那里调用它。如何使用boost.python 在 C++ 端编写代码来实现这一点?

【问题讨论】:

    标签: c++ python callback boost-python


    【解决方案1】:

    如果它可能有任何名称:

    将其传递给接受boost::python::object 的函数。

    bp::object pycb; //global variable. could also store it in a map, etc
    void register_callback(bp::object cb)
    {
          pycb = cb;
    }
    

    如果它位于具有一致名称的单个已知命名空间中:

    bp::object pycb = bp::scope("namespace").attr("callback");
    

    bp::object 定义了operator(),因此您可以像调用任何函数一样调用它

    ret = pycb()
    

    【讨论】:

    • 谢谢马修,我还有一个问题。这里 python 对象是从同一个线程调用的。如果 python 对象是全局的并且被不同的线程调用怎么办?
    • 这是可能的,虽然有点超出了这个问题的范围。我建议研究 C/Python API 的 PyGILState_* 系列函数。与 Boost-Python 不同,Python 有非常好的文档。如果您仍需要更多帮助,请提出另一个问题。
    • 对于未来的观众:最终有人问了另一个问题,我回答了。看这里:stackoverflow.com/questions/8009613/boost-python-not-supporting-parallelism/8011153#8011153
    • @MatthewScouten 能否请您提供一个上述主题的简单工作示例,以便我能够很好地理解,因为我对 C++ 非常陌生,而且我对 Python 了解更多。
    • 谢谢。现在,如果 boost 在他们的文档中提供了一个简单的示例说明您如何做到这一点……至少我们有 Stack Overflow。
    【解决方案2】:

    我使用PyRun_SimpleString("myFunction()") 作为快速破解,因为我的函数的名称是已知的,不带任何参数并位于__main__ 命名空间中。请注意,如果您是多线程的,则还需要获取 lock GIL。

    【讨论】:

      【解决方案3】:

      我以前没用过,但参考手册中有一个名为 Calling Python Functions and Methods 的部分,似乎显示了如何做到这一点。

      【讨论】:

      • Boost python 文档在很大程度上已经过时并且非常糟糕,即使它是最新的。
      • 该页面没有显示 Python 函数。它只是向您展示如何使用已绑定的对象调用一个。不完全是一个“简单的例子”。
      【解决方案4】:

      没有线索。但是一旦你有了函数对象,你就可以使用PyObject_Call()来调用它。

      【讨论】:

      • 如果你有一个boost::python::object,你可以用它的operator()来调用它。
      猜你喜欢
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2016-03-25
      • 2016-05-29
      • 1970-01-01
      • 2021-02-07
      相关资源
      最近更新 更多