gpt4 book ai didi

python - 使用命名空间从 C++ 调用 Python 函数

转载 作者:太空狗 更新时间:2023-10-29 20:58:08 29 4
gpt4 key购买 nike

我正在尝试从 c++ 执行 Python 代码,该代码将定义一个 Python 函数并将其传回 c++,以便可以从那里回调它。这工作正常,但问题是我无法为 Python 函数提供它最初定义时的命名空间。

struct MyClass {
void log(const std::string & s)
{
cout << s << endl;
}
void callFnct(PyObject * fnct)
{
bp::call<void>(fnct);
bp::call<void>(fnct);
}
};

bp::class_<MyClass, boost::noncopyable> plugin("Plugin", bp::no_init);
plugin.def("callFnct", &MyClass::callFnct);

std::unique_ptr<MyClass> cls(new MyClass());

bp::object main_module = bp::import("__main__");
bp::object main_namespace = main_module.attr("__dict__");
bp::dict locals;
locals["plugin"] = bp::object(bp::ptr(cls.get()));

std::string scriptSource =
"a=5\n"
"def my_func():\n"
" a+=1\n"
" plugin.log('won't work %d' % a)\n"
"plugin.log('this works')\n"
"plugin.callFnct(my_func)";
bp::object obj = bp::exec(bp::str(scriptSource), main_namespace, locals);

初始调用 plugin.log()可以,但是一旦我们在 callFnct() 中调用 python 函数,命名空间消失了,所以它看不到变量 aplugin模块。

有谁知道怎么做bp::call<void>(fnct)通过保留 namespace 并保留变量 a在范围内?

最佳答案

那是因为非本地范围内的变量不能被反弹。即使不调用 C++,它也不会工作:

a = 5
def my_func():
a += 5
print(a)
my_func()

UnboundLocalError: local variable 'a' referenced before assignment

您需要先导入它:

a = 5
def my_func():
global a
a += 5
print(a)
my_func()

关于python - 使用命名空间从 C++ 调用 Python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28371238/

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