如何通过Boost :: Python获取调用我的C ++函数的Python模块和行号?

时间:2010-04-17 19:43:30

标签: c++ stack-trace boost-python

我有一个C ++函数,可以通过Boost :: Python从许多Python函数中调用。当C ++函数检测到错误的参数时,我想写一条日志消息并继续处理。在该日志消息中,我想要注意调用C ++的Python模块和行号。我怎么能这样做?

我能够从C ++中抛出一个异常,它被翻译成我可以捕获的Python异常,但这会中止我不能拥有的C ++函数。

例如,如果factorial()收到的数字小于1,我想要记录一条警告消息。忽略它可以轻松处理案件的事实(并且确实如此) - 我的老板无论如何都想要警告。 ;)

可以直接从Python调用此代码,也可以从Python调用的其他C ++函数调用此代码,因此C ++堆栈跟踪本身不是很有用。

int factorial(int n) {
    if (n < 1) {
        logMsg("invalid n passed to factorial() at %s, line %d", 
                <python-module>, <python-line-number>);
    }
    return n <= 1 ? 1 : n * factorial(n - 1);
}

我希望Boost :: Python库能够从C ++中提供这种能力。

1 个答案:

答案 0 :(得分:0)

我想到的最简单的事情是使用python模块包装c ++库 并让python函数包装c ++函数。 你必须用python模块交换你的c模块名,这样所有的python函数都会调用python模块而不是c ++模块。

mv my_cmodule_name.so - &gt; __my_cmodule_name.so(并在代码中更改其名称)

#my_cmodule_name.py

import my_cmodule_name as cmod
import traceback

def catchBadArgsDecorator(function):
    def _inner(*args,**kwds):
        try:
          return function(*args, **kdws)
        except ValueError:
          _, line, function, _ = traceback.extract_stack()[-1]
         log("Call to %s(%s) from %s@%d failed" % ( function.__name__, str(args), function,line)
    return _inner

# for all your modules functions
myfunction = catchBadArgsDecorator(cmod.myfunction)

代码未经测试且可以改进,但我希望你明白这一点。