【问题标题】:Boost Python : Having problems importing a moduleBoost Python:导入模块时遇到问题
【发布时间】: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


【解决方案1】:

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

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

Boost.Python 的 BOOST_PYTHON_MODULE 宏遵循这些约定。

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

PyInit_PyBackend.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 2011-01-17
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多