2012-02-24 35 views
4

在我自己創作的Python包目錄,我有一個__init__.py文件,上面寫着:的Python:進口和更改規範名稱在當前模塊中

from _foo import * 

在同一目錄中有一個_foomodule.so其由上面加載。共享庫在C++中實現(使用Boost Python)。這讓我說:

import foo 
print foo.MyCppClass 

這工作,但有一個怪癖:

foo._foo.MyCppClass 

因此,儘管MyCppClass存在如下:類是完整的包路徑,這使得它打印這個已知的Python foo,foo.MyCppClass中的別名不是其規範名稱。除了有點難看,這也使help()有點跛腳:help(foo)會說foo包含一個模塊_foo,並且只有當你說help(foo._foo)你是否獲得了MyCppClass的文檔。

有沒有什麼我可以在__init__.py或其他方式做不同的做法,否則,使Python看到foo.MyCppClass作爲規範的名稱?

我正在使用Python 2.7;如果該解決方案也可以在2.6上運行,那將會很好。

+0

如果'_foo'模塊是用Python編寫的,我只是告訴你改變你的類的__module__'屬性(你可以在定義每個類之後做這個,或者寫一個一次完成它的循環)但該屬性可能不能在你的C++類中寫入......也許有一些方法可以在Boost中更改該屬性? (從來沒有用過我自己。) – kindall 2012-02-24 18:58:40

+0

我想我可以改變模塊名稱,但改變它是什麼?我不想從'foo._foo.MyCppClass'到'foo.bar.MyCppClass' - 我只想把'foo.MyCppClass'作爲Python中的規範名稱。 – 2012-02-25 16:51:58

回答

2

我有同樣的問題。您可以在您的Boost.Python定義中更改模塊名稱:

BOOST_PYTHON_MODULE(_foo) 
{ 
    scope().attr("__name__") = "foo"; 
    ... 
} 

幫助問題是一個單獨的問題。我認爲您需要將每個項目添加到__all__以將其導出以提供幫助。

當我這樣做時,foo.MyCppClass的名稱就是 - foo.MyCppClass - 和help(foo)提供了MyCppClass的文檔。

+0

只是設置'__name__'似乎解決了我。我試圖找出一種方法,使其完全在'__init __。py'文件中執行'import *'文件,但我沒有成功。如果我想避免更改C++代碼,是否可以在Python中設置__name__'?謝謝! – 2012-07-30 15:01:56

1

可以通過添加行

__all__ = ['MyCppClass'] 

__init__.py文件解決help()問題。

+0

這是一個有趣的觀點,所以謝謝。但是,我仍然在尋找解決我的「真正」問題的方法......修復help()將會很好。 – 2012-02-29 10:24:16