【发布时间】:2012-05-04 02:21:06
【问题描述】:
我目前正在尝试使用Boost Python导出一个类,然后在对应的程序中使用它。
/**
main.cpp
*/
#define BOOST_PYTHON_STATIC_LIB
#include <Resource\ZipResourceFile.hpp>
#include <Resource\ResourceCache.hpp>
#include <Windows.h>
#include <boost/python.hpp>
#include <iostream>
/* a simple add method, for s & g's */
int add(int a, int b)
{
return a + b;
}
/* Foo class*/
class Foo
{
public:
Foo(int n);
~Foo();
void f();
};
/* Foo ctor, does nothingm just wanted to pass and arg */
Foo::Foo(int n)
{
}
/* destructor */
Foo::~Foo()
{
}
/* f() implementation, calls Foo!!! to cout */
void Foo::f()
{
std::cout << "Foo!!!" << '\n';
}
/* Boost python module definition */
BOOST_PYTHON_MODULE(PyBackend)
{
using namespace boost::python;
def("add", add);
class_<Foo>("Foo", init<int>())
.def("f", &Foo::f);
}
int main(int argc, char* argv[])
{
PyImport_AppendInittab("PyBackend", init_PyBackend);
Py_Initialize();
PyRun_SimpleString("import PyBackend");
PyRun_SimpleString("foo = PyBackend.Foo(1)");
Py_Finalize();
{
int n;
std::cin >> n;
}
return 0;
}
无论如何,我不知道在哪里可以找到函数 init_PyBackend,尽管如果我不使用 Boost.Python,这似乎是合乎逻辑的事情。
模块本身不在单独的 DLL 中,它是同时编译的。无论如何,有人对我能做什么有任何想法吗?
【问题讨论】:
-
以后,请将任何相关代码/错误内联,而不是链接到外部站点。
-
哦,好的,谢谢伙计!我试图突出显示它然后按 ctrl-k,但它的格式不正确。你是怎么把它全部格式化的。
-
Ctrl+K 是正确的方法,但如果这不起作用,工具栏上总是会出现
{}图标。 :-] 话虽如此,我不清楚你的问题是什么——为什么要关心init_PyBackend?你有什么实际问题? -
啊,我认为在 Python 3 中,约定从
init...更改为PyInit_...,所以试试PyInit_PyBackend。 Boost 标头有点难以理解,但它们似乎证实了这一点:boost.org/doc/libs/1_49_0/boost/python/module.hpp(和 module_init.hpp) -
老兄,成功了!太感谢了!请将此作为答案发布,以便我接受。 :)
标签: c++ python boost boost-python