2012-05-04 28 views
5

Tôi hiện đang cố gắng sử dụng Boost Python để xuất một lớp và sau đó sử dụng nó trong chương trình tương ứng.Boost Python: Gặp sự cố khi nhập mô-đun

/** 
    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; 
} 

Dù sao, tôi không biết tôi có thể tìm hàm init_PyBackend ở đâu, mặc dù điều đó có vẻ hợp lý nếu tôi không sử dụng Boost.Python.

Mô-đun chính nó không nằm trong một DLL riêng biệt, nó được biên dịch tất cả cùng một lúc. Dù sao, bất cứ ai có bất kỳ ý tưởng về những gì tôi có thể làm gì?

+0

Trong tương lai, vui lòng đặt bất kỳ mã/lỗi có liên quan nào bên trong thay vì liên kết đến trang web bên ngoài. – ildjarn

+0

Được rồi, cảm ơn bạn! Tôi đã cố gắng để làm nổi bật tất cả rồi ctrl-k, nhưng nó không định dạng nó đúng. Làm thế nào bạn có được nó tất cả các định dạng độc đáo. – DubyaDubyaDubyaDot

+0

Ctrl + K là cách tiếp cận đúng, nhưng nếu điều đó không hoạt động thì luôn có biểu tượng '{}' trên thanh công cụ. : -] Điều đó đang được nói, không rõ ràng với tôi câu hỏi của bạn là gì - tại sao phải quan tâm đến 'init_PyBackend'? Bạn đang gặp phải vấn đề gì? – ildjarn

Trả lời

10

Quy ước đặt tên cho các chức năng mô-đun khởi là:

  • init*** cho Python 2.x (không gạch dưới).
  • PyInit_*** cho Python 3.x.

Boost.Python's BOOST_PYTHON_MODULE macro tuân theo các quy ước này.

Vì bạn đang sử dụng Python 3.2, chức năng khởi tạo các mô-đun PyBackend của bạn sẽ do đó được gọi là:

PyInit_PyBackend.

Lưu ý rằng đối với các mô-đun có tên bắt đầu bằng dấu gạch dưới, như _sre, các hàm init là init_sre/PyInit__sre (chú ý hai dấu gạch dưới cho Python 3.x).

Các vấn đề liên quan