用C++估算嵌入式python脚本的进度

查尔斯

介绍

假设我有一个带有嵌入式 python 脚本的 C++ 应用程序。脚本做了一些繁重的计算,需要很长时间才能结束。完成后,我可以提取脚本的结果。但是,知道计算的实际停留时间是多少会很方便 - 目前是否完成了 10% 或一半的工作?这是一个示例代码(使用boot python):

app.cpp

#include <iostream>
#include <boost/python.hpp>

using namespace boost::python;

int main()
    try
    {
    Py_Initialize();
    object module = import("__main__");
    object name_space = module.attr("__dict__");
    exec_file("Script.py", name_space, name_space);

    object MyFunc = name_space["MyFunc"];
    object result = MyFunc();

    double sum = extract<double>(sum);}

Py_Finalize();

Script.py

def MyFunc():
    cont = 0
    while (cont < 10000):
        #...some calculations here, increasing "result" value on each step...
        cont +=1
    return result

问题

如果代码全部使用 C++,我可以使用本机框架工具,如emit, 来访问 GUI 进度条插槽,并更新其值。但是在上面描述的情况下呢?在控制台应用程序中,我cont每次都可以直接从 python打印然而,它不是任何带有 GUI 的 C++ 的解决方案。有什么方法可以从 C++ 代码级别确定在哪一圈循环中执行Script.py或者也许还有其他解决方案可以为进度条提供服务?

查尔斯

总结评论部分的结论:问题可以通过给python调用的函数一个回调来解决。.cpp 看起来像这样:

#include <iostream>
#include <boost/python.hpp>

using namespace boost::python;

int main(){
    Py_Initialize();
    object module = import("__main__");
    object name_space = module.attr("__dict__");
    exec_file("Script.py", name_space, name_space);

    object MyFunc = name_space["MyFunc"];
    object result = MyFunc();

    double sum = extract<double>(sum);}

    Py_Finalize();}

callback(int cont){
    int cont_final = 10000;
    double progr = cont / cont_final * 100;
    cout << cont << "\n";}

请记住,回调需要是静态成员或自由函数(在这种情况下,我已经展示了第二个选项)。如果您还需要传递状态(例如由于 GUI),请查看此处

Python 部分将是:

def MyFunc(callback):
    cont = 0
    while (cont < 10000):
        #...some calculations here, increasing "result" value on each step...
        cont +=1
        callback(cont) #Here we call progress update
    return result

就是这样 - 在结果中,从 0 到 100 的进度指示器将被打印到控制台。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章