首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Boost::Python获得调用C++函数的Python模块和行号?

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

Stack Overflow用户
提问于 2010-04-18 03:43:30
回答 1查看 608关注 0票数 3

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

我可以从C++抛出一个异常,该异常被转换为我可以捕获的Python异常,但这会中止C++函数,这是我不能拥有的。

例如,假设我想在factorial()接收到一个小于1的数字时记录一条警告消息。忽略这样一个事实,即它可以很容易地处理这种情况(而且确实是这样)--我的老板无论如何都想要一个警告。;)

这段代码可以直接从Python中调用,也可以从Python中调用的其他C++函数中调用,因此C++堆栈跟踪本身没有多大帮助。

代码语言:javascript
复制
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++中提供这种能力。

EN

回答 1

Stack Overflow用户

发布于 2010-04-18 04:03:15

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

mv my_cmodule_name.so -> __my_cmodule_name.so (并在代码内部更改其名称)

代码语言:javascript
复制
#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)

代码未经测试,可以改进,但我希望您能理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2659746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档