gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:20 26 4
gpt4 key购买 nike

我有一个 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++ 中提供这种能力。

最佳答案

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

mv my_cmodule_name.so -> __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)

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

关于c++ - 如何通过 Boost::Python 获取调用我的 C++ 函数的 Python 模块和行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2659746/

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