是否可以在C++程序中创建Python模块中定义的类的实例
Is it possible to create instance in C++ program of a class defined in Python module?
我要做的是在C++程序中创建一个虚拟类(ClassTest),然后在Python脚本中导入它,在该脚本中创建派生类,然后在C++中导入该派生类。
这是我迄今为止想出的代码:
#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;
using namespace std;
class ClassTest {
public:
ClassTest () {}
virtual int someFunction () = 0;
};
BOOST_PYTHON_MODULE(ClassTest) {
class_< ClassTest, boost::noncopyable >("ClassTest", no_init)
.def("someFunction", &ClassTest::someFunction)
;
}
int main() {
try {
Py_Initialize();
initClassTest();
ClassTest* testObject = **???**
cout << "Function result = " << testObject.someFunction() << endl;
Py_Finalize();
} catch (error_already_set& e) {
PyErr_PrintEx(0);
return 1;
}
return 0;
}
还有Python脚本:
import ClassTest
class classTestChild(ClassTest.ClassTest):
def someFunction ():
return 4;
以下是如何做到这一点的完整示例。您需要一个包装器类,以便可以在Python中重写虚拟函数。
ClassTest.h:
class ClassTest
{
public:
virtual ~ClassTest(){}
virtual int someFunction () = 0;
};
ClassTest.cpp(必须内置到.so/.dll中):
class ClassTestWrap : public ClassTest, public python::wrapper<ClassTest>
{
public:
virtual int someFunction() override
{
if (python::override f = this->get_override("someFunction"))
return f();
return ClassTestWrap::someFunction();
}
};
BOOST_PYTHON_MODULE(ClassTest)
{
python::class_< ClassTestWrap, boost::noncopyable >("ClassTest")
.def("someFunction", python::pure_virtual(&ClassTestWrap::someFunction));
}
main.cpp(可执行文件):
try
{
Py_Initialize();
python::object main = python::import("__main__");
python::object global(main.attr("__dict__"));
python::object ignored = python::exec("import ClassTestn"
"class classTestChild(ClassTest.ClassTest):n"
" def someFunction(self):n"
" return 4n"
"n"
"child = classTestChild()", global);
ClassTest *obj = python::extract<ClassTest*>(global["child"]);
int value = obj->someFunction();
printf("value = %dn", value);
Py_Finalize();
}
catch (python::error_already_set&)
{
PyErr_Print();
PyErr_Clear();
}
输出:
value = 4
如果ClassTest.so/ClassTest.dll和.exe在同一文件夹中,并且从同一文件夹(./test.exe)调用.exe,则此示例将起作用。
相关文章:
- TraciMobility::getExternalId 将自定义模块添加到示例中时出错Veins_Inet (Omne
- 尝试运行 wasm 函数时出现模块未定义错误
- Metatrader 5 向导无法识别我的自定义交易信号模块
- 是否可以使用另一个lua文件中定义的表,该表在当前文件中不需要作为模块
- C++-在没有自定义.lib文件的情况下从Lua C模块调用Lua函数
- 如何将自定义C++模块集成到自定义版本的 NodeJS 中?
- 在FreesWitch中使用AWS C SDK加载模块时未定义的符号错误
- C++ 包含中的"未定义"模块关键字
- 为什么无法在 Cocoa 应用程序调用的 C++ func 中嵌入自定义 Python 模块
- 使用 mlpack 时 Cython 模块中的未定义符号
- Python 错误:在 SWIG 生成的C++模板化代码模块中没有定义构造函数
- Boost.Python - ImportError:动态模块未定义模块导出函数(PyInit_example)
- 不同模块中的ambigus结构定义
- 使用自定义模块构建 python 解释器时出现问题
- c++运行python代码导入自定义模块
- 如何将我的自定义模块与 Omnet++INET 的简单模块相结合
- Python ImportError-未定义的符号-用于自定义C++模块
- php自定义C++模块通过命令行工作,而不是在Web服务器上
- 从自定义构建的Python导入自定义模块失败
- 如何将自定义模块加载到Lua中