C嵌套python脚本调用心得

本文分享了作者开发多核性能功耗分析工具的过程,包括使用wtl界面、python进行数据分析以及gator作为数据源的技术细节。文章详细记录了遇到的问题及其解决方法,如函数接口差异导致的执行失败、py执行路径设置、段错误排查、测试代码辅助调试等。同时强调了将计算任务放入线程以避免影响界面操作的重要性,并提供了将C的__FILE__:__LINE__效果应用到python中的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近为工作需要,开发了一套多核性能功耗分析工具,其中涉及到大量数值分析,因此采用了界面用wtl,数据分析用python,数据源使用gator的组合方式加以实现。其中掉了几个小坑(十多分钟解决),记录如下:


1,每个公式使用一个独立的py,提供的接口能力不同,因此存在某函数不存在或者函数返回为空的情况,此时再一次生成数据的过程中,其它函数可能因此无法正确执行,需要在每次函数执行完,调用PyErr_clear,清除错误状态。


2,通过PySys_SetPath将公式所在目录加入py的执行路径里,此函数放在Py_Initialize();之后

    int len;
    LPTSTR pos;
    len = GetModuleFileName(_Module.m_hInst, szCurPath, sizeof(szCurPath));
    pos = StrRChr(szCurPath, szCurPath+len, _T('\\'));
    if(pos==0) return FALSE;
    *pos = _T('\0');
    StrCat(szCurPath, _T("\\formula\\"));

    USES_CONVERSION;
    if(!pypath[0])
    {
        strcpy_s(pypath, 4096, Py_GetPath());
        strcat_s(pypath, 4096, ";");
        strcat_s(pypath, 4096, T2A(szCurPath));
    }

     PySys_SetPath(pypath);

3,如果PyEval_CallObject出现莫名其妙的段错误,很有可能是在之前过度使用了Py_DECREF


4,在每个公式py文件下面,可以添加测试代码,用来调试py里面的bug

if __name__=="__main__":

       setParam("coreid","1")

       print “data:”,data()

       print "eneryg:",energy()

       print "tip:",tip()

5,  把计算放入线程,不要影响界面操作

DWORD __stdcall calcTrd( LPVOID lpThreadParameter)
{
    CurveData *curve = reinterpret_cast<CurveData*>(lpThreadParameter);
    CDataSource * ins = CurveData::engIns;

    PyGILState_STATE state = PyGILState_Ensure( );

....

    PyGILState_Release( state );
    return 0;
}

BOOL CDataSource::calc( CurveData & curve )
{
    Py_Initialize();
    PySys_SetPath(pypath);
    PyEval_InitThreads();
    PyEval_ReleaseThread(PyThreadState_Get());

    DWORD trid;
    HANDLE handle = CreateThread(NULL, 0, calcTrd, &curve, 0, &trid);


    MSG msg;
    while(WaitForSingleObject(handle, 0) != WAIT_OBJECT_0)
    {

        CWaitCursor cursor;


        if(GetMessage(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage (&msg);
        }
        else
        {
            PostQuitMessage(0);
        }
    }
    WaitForSingleObject(handle, INFINITE);


    CloseHandle(handle);
    PyGILState_Ensure();
    Py_Finalize();


    return TRUE;
}

6, 仿照C的__FILE__:__LINE__效果:

def dbg():
    try:
        raise Exception
    except:
        return "%s:%d"%(os.path.basename(sys.exc_info()[2].tb_frame.f_back.f_code.co_filename),sys.exc_info()[2].tb_frame.f_back.f_lineno)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值