gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:11:55 24 4
gpt4 key购买 nike

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

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(...) {}
}

问题:

这个“ Controller ”有一些必须异步调用的函数。它的工作是连续的,此外它还可以抛出异常。这就是为什么 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”,但该函数似乎被阻塞了。它永远不会回来。

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

最佳答案

您似乎误解了 std::async 的行为

一段测试代码:

#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);

关于python - boost::python - 如何从 C++ 在自己的线程中调用 python 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39376579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com