2011-09-19 48 views
0

我通過Ubuntu安裝libboost。升級版本是1.42。 我跟着加速網站上的例子:我需要爲Boost.Python定義一個PyMODINIT_FUNC來公開一個C++類嗎?

#include <string> 

struct World 
{ 
    void set(std::string msg) { this->msg = msg; } 
    std::string greet() { return msg; } 
    std::string msg; 
}; 

然後創建的IDL:

#include <boost/python.hpp> 
using namespace boost::python; 

BOOST_PYTHON_MODULE(hello) 
{ 
    class_<World>("World") 
     .def("greet", &World::greet) 
     .def("set", &World::set) 
    ; 
} 

,並與建設的bjam它:

using python ; 

lib libboost_python : : <name>boost_python ; 

project 
    : requirements <library>libboost_python 
; 

python-extension world : world.cpp ; 

但只要我進口世界,我得到:

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import world 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: dynamic module does not define init function (initworld) 
>>> 

我猜它在尋找這樣一個功能:

PyMODINIT_FUNC initworld(void) { 
... 
} 

但我不應該的Boost.Python創建此?該函數是否正在生成,但未找到?或者我需要自己寫嗎?

我知道它真的試圖導入生成的模塊,因爲它從另一個目錄執行時會給出不同的錯誤。

jsna[email protected]:~/Dropbox/flycap/pytest$ bjam 
...found 10 targets... 
...updating 5 targets... 
MkDir1 bin 
MkDir1 bin/gcc-4.5.2 
MkDir1 bin/gcc-4.5.2/debug 
gcc.compile.c++ bin/gcc-4.5.2/debug/world.o 
gcc.link.dll bin/gcc-4.5.2/debug/world.so 
...updated 5 targets... 
[email protected]:~/Dropbox/flycap/pytest$ python 
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import world 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named world 
>>> 

在正確的目錄:

[email protected]:~/Dropbox/flycap/pytest$ cd bin/gcc-4.5.2/debug/ 
[email protected]:~/Dropbox/flycap/pytest/bin/gcc-4.5.2/debug$ python 
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import world 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: dynamic module does not define init function (initworld) 
+0

你能檢查python是否真的試圖導入boost :: python模塊生成的模塊嗎? 嘗試使其名稱唯一,以便路徑中不存在具有相同名稱但具有另一個擴展名的其他文件。 –

+0

是,其導入正確的文件。我試圖在該目錄中刪除目標文件,只保留.so文件作爲唯一的文件,並得到相同的結果。 – nont

回答

0

好吧,我發現爲什麼這是行不通的。我的C++類在一個文件中,而我的IDL在另一個文件中。由於它看起來不像Python或C++,我認爲它屬於單獨的文件。所以IDL的東西從來沒有被拾起。

一旦我把它放在World.cpp中,一切都按預期工作!非常順利。

我想通過查看另一個Python GraphViz綁定項目,發現他們所有的Boost.Python的東西都被擠進了同一個文件中。 http://code.google.com/p/yapgvb/

相關問題