Boost Python:导入模块时遇到问题

时间:2012-05-04 02:21:06

标签: c++ python boost boost-python

我目前正在尝试使用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中,它是同时编译的。无论如何,任何人对我能做什么都有任何想法?

1 个答案:

答案 0 :(得分:10)

命名模块初始化函数的约定是:

  • init***用于Python 2.x(无下划线)。
  • PyInit_*** for Python 3.x。

Boost.Python的BOOST_PYTHON_MODULE宏遵循这些惯例。

由于您使用的是Python 3.2,因此将调用PyBackend模块的初始化函数:

PyInit_PyBackend

请注意,对于名称以下划线开头的模块,如_sre,init函数为init_sre / PyInit__sre(注意Python 3.x的两个下划线)。