boost::python - 如何从 C++ 在自己的线程中调用 python 函数?

     2023-02-16     235

关键词:

【中文标题】boost::python - 如何从 C++ 在自己的线程中调用 python 函数?【英文标题】:boost::python - how to invoke a python function in its own thread from C++? 【发布时间】:2017-01-15 12:56:01 【问题描述】:

我有一个用 python 编写的模块。这个模块是我在 Python 中实现的许多不同功能的接口:

EmbeddingInterface.py 只是导入这个模块并创建一个实例:

import CPPController

cppControllerInstance = CPPController()

我想在 c++ 中使用 cppControllerInstance。这是我到目前为止所做的:

#include <Python.h>
#include <boost\python.hpp>

using namespace boost;

python::object createController()

    try
    
        Py_Initialize();

        python::object mainModule = python::import("__main__");
        python::object mainNamespace = mainModule.attr("__dict__");

        python::dict locals;

        python::exec(
            "print \"loading python implementetion:\"\n"
            "import sys\n"
            "sys.path.insert(0, \"C:\\Projects\\Python\\ProjectName\\Panda\")\n"
            "import EmbeddingInterface\n"
            "controller = EmbeddingInterface.cppControllerInstance\n",
            mainNamespace, locals);

            python::object controller = locals["controller"];
            return controller;
    
    catch(...) 

问题:

这个“控制器”有一些必须异步调用的函数。 它的工作是连续的,此外它还可以抛出异常。 这就是为什么 std::async 听起来很棒的原因。

但它不起作用:

int main()

    python::object controller = createController();
    python::object loadScene = controller.attr("loadScene");
    //loadScene(); // works OK but blocking!
    std::async(loadScene); // non blocking but nothing happens!
    while(true); // do some stuff

我试图用自己的线程调用 python 函数“loadScene”,但该函数似乎被阻塞了。它永远不会回来。

这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

看来你误解了std::async的行为

测试代码的sn-p:

#include <iostream>
#include <chrono>
#include <thread>
#include <future>

int doSomething()
  std::cout << "do something"<<std::endl;
  return 1;


int main()
   auto f = std::async(doSomething);

   std::this_thread::sleep_for(std::chrono::seconds(3));
   std::cout <<"wait a while"<<std::endl;
   f.get();
   return 0;

输出:

wait a while
do something

换行

auto f = std::async(doSomething);

auto f = std::async(std::launch::async,doSomething);

然后输出:

do something
wait a while

作为您的示例,要立即在另一个线程中运行它,您可以尝试:

std::async(std::launch::async,loadScene);

【讨论】:

确实,当时我不理解 std::async 的行为以及 std::future 析构函数阻塞的事实。但是关于在不同的 c++ 线程上调用 python 函数,它并不像你说明的那么简单,需要使用 GIL(python 全局解释器锁)进行操作。

使用 boost::python 从 C++ 创建 python collections.namedtuple

】使用boost::python从C++创建pythoncollections.namedtuple【英文标题】:Creatingpythoncollections.namedtuplefromC++usingboost::python【发布时间】:2012-12-0300:02:37【问题描述】:我想从boost::python包装函数返回collections.namedtuple的列表,但我不确定如何... 查看详情

Boost.Python 从 C++ 创建对现有 Python 对象的新引用

】Boost.Python从C++创建对现有Python对象的新引用【英文标题】:Boost.PythoncreatenewreferencetoexistingPythonobjectfromC++【发布时间】:2014-11-2111:10:35【问题描述】:我正在使用Boost.Python包装一个C++类X。在创建这个类的一个对象的那一刻,我... 查看详情

使用 boost::python 将回调从 python 传递到 c++

】使用boost::python将回调从python传递到c++【英文标题】:passcallbackfrompythontoc++usingboost::python【发布时间】:2011-08-2612:32:19【问题描述】:我想将我的python代码中的回调传递给c++我希望我的代码看起来像这样:在C++中:typedefvoid(*MyCa... 查看详情

如何在 boost::python 扩展模块中正确组合 C++ 和 Python 代码?

】如何在boost::python扩展模块中正确组合C++和Python代码?【英文标题】:HowtoproperlycombineC++andPythoncodeinboost::pythonextensionmodule?【发布时间】:2014-05-0900:21:41【问题描述】:我正在尝试创建结合了C++和Python代码的Python扩展模块。到目... 查看详情

如何使用 PyObjects 声明 Boost.Python C++ 类

】如何使用PyObjects声明Boost.PythonC++类【英文标题】:HowcanideclareaBoost.PythonC++ClasswithPyObjects【发布时间】:2014-05-2113:17:51【问题描述】:我想用PyObjects编写一个c++类,以便从Python访问它们,以便用现有的Python对象实例引用它们。简... 查看详情

Boost.Python 如何拥有 C++ 类?

】Boost.Python如何拥有C++类?【英文标题】:HowdoesBoost.PythonholdC++class?【发布时间】:2015-01-2806:39:38【问题描述】:我知道如何使用Boost.Python来包装暴露给Python的C++类。使用Boost.Python如此方便地进行包装,真的很强大。然而,关于B... 查看详情

使用 boost::python 从 c++ 函数访问大表

】使用boost::python从c++函数访问大表【英文标题】:Largetableaccessfromc++functionswithboost::python【发布时间】:2016-09-0400:45:38【问题描述】:我正在用C++生成一个非常大的查找表,并从各种C++函数中使用它。这些函数使用boost::python暴露... 查看详情

如何使用 boost/python 向 python 公开 C++ 虚函数?

】如何使用boost/python向python公开C++虚函数?【英文标题】:HowtoexposeC++virtualfunctionstopythonusingboost/python?【发布时间】:2020-07-2722:30:46【问题描述】:编辑:使构造函数和析构函数为虚拟并没有帮助根据boost/pythondocumentation,我可以... 查看详情

Python 库:如何从 Python 程序调用 C++ 函数?

】Python库:如何从Python程序调用C++函数?【英文标题】:LibraryforPython:HowtocallC++functionsfromPythonprogram?【发布时间】:2011-09-1220:34:10【问题描述】:有一个Python库,可以调用(可以在没有extern"C"的情况下调用C++格式的函数。请您提... 查看详情

如何从 boost::python 返回 numpy.array?

】如何从boost::python返回numpy.array?【英文标题】:howtoreturnnumpy.arrayfromboost::python?【发布时间】:2012-05-2821:55:29【问题描述】:我想从C++代码中返回一些数据作为numpy.array对象。我看过boost::python::numeric,但它的文档非常简洁。我... 查看详情

Boost Python无法将图像从python传递到c++

】BoostPython无法将图像从python传递到c++【英文标题】:BoostPythoncannotpassimagefrompythontoc++【发布时间】:2019-03-1716:17:42【问题描述】:我正在尝试使用boost.python将图像从python传递到C++。这是我的python代码:importcv2imgs=[]img1=cv2.imread(\'i... 查看详情

boost::python 从 numpy.ndarray 返回值中提取 c++ 值

】boost::python从numpy.ndarray返回值中提取c++值【英文标题】:boost::pythonextractc++valuefromnumpy.ndarrayreturnvalue【发布时间】:2015-06-0515:59:30【问题描述】:我想用boost::python包装一个返回python值的函数array(28.4)类型numpy.ndarray我无法将此值... 查看详情

使用 Boost Python 从 c++ 类创建派生的 Python 类

】使用BoostPython从c++类创建派生的Python类【英文标题】:Createderivedpythonclassfromac++classusingBoostPython【发布时间】:2015-12-2120:59:39【问题描述】:我有一个共享库,我用boostpython创建了一堆类,我希望能够从python中的这些类继承。继... 查看详情

使用 c++ boost::python 从 python 函数返回的列表中获取数据?

】使用c++boost::python从python函数返回的列表中获取数据?【英文标题】:Getdatafromalistreturnedbyapythonfunctionusingc++boost::python?【发布时间】:2020-10-2819:18:16【问题描述】:我有一个python函数返回一个浮点列表:#Script.pydefget_double_list():d... 查看详情

Boost.Python 从类型创建句柄

】Boost.Python从类型创建句柄【英文标题】:Boost.Pythoncreatehandlefromtype【发布时间】:2016-07-0614:21:13【问题描述】:在将C++代码暴露给python的某些地方,我需要使用PyObject*。如果我有一个boost::python::class_对象的实例,我可以在其上... 查看详情

如何使用 Boost.Python 定义 Python 元类?

】如何使用Boost.Python定义Python元类?【英文标题】:HowtodefineaPythonmetaclasswithBoost.Python?【发布时间】:2012-02-2111:40:31【问题描述】:PythonCAPI有PyObject*PyType_Type对象,相当于解释器中的type。如果我想在C++中定义一个元类,我如何将... 查看详情

Embedded Boost::Python 和 C++:并行运行

】EmbeddedBoost::Python和C++:并行运行【英文标题】:EmbeddedBoost::PythonandC++:runinparallel【发布时间】:2013-08-1315:25:28【问题描述】:如何在没有问题的情况下并行运行C++和Boost::Python代码?例如,在我的游戏中,我希望Python代码与C++代... 查看详情

在 boost python 中暴露 C++ 接口

】在boostpython中暴露C++接口【英文标题】:ExposingC++interfaceinboostpython【发布时间】:2013-11-1818:15:04【问题描述】:示例代码说明:structBasevirtualintfoo()=0;;structDerived:publicBasevirtualintfoo()return42;;Base*get_base()returnnewDerived;BOOST_PYTH 查看详情