2011-07-04 10 views
2

私は、次のような構造を持つPythonの3プロジェクトがあります。Pythonで名前空間パッケージを作成するには?

project/ 
| 
+--root/ 
    | 
    +--__init__.py 
    | 
    +--sub/ 
     | 
     +--__init__.py 
     | 
     +--actualcode.py 

私は別のプロジェクトに関連する他のlibsとの共通の名前空間の私のlib株式ように、「名前空間パッケージ」を使用したいが。 import文は次のようになります。

from root.sub.actualcode import something 

ルートフォルダに__init__.pyファイルには、名前空間のパッケージを作成するには、次のステートメントが含まれます。

from pkgutil import extend_path 
__path__ = extend_path(__path__, __name__) 

をしかし、私はroot.subをインポートするとき、私は、コードを参照することはできません。それは私が書くときにのみ動作します:

from sub.actualcode import something # doesn't work with "root.sub..."! 

私は名前空間としてroot使用するために何をすべきか?

+0

あなたのパッケージのsetup.pyに名前空間が正しく定義されていますか? –

+1

distutilsには、setup.pyに名前空間を設定するための属性がありません。 http://docs.python.org/py3k/distutils/setupscript.html – deamon

+0

誰もdistutilsを気にしません。 setuptoolsやdistributeを入手する方法は –

答えて

0

distributeで名前空間パッケージを構築できます。トリックは、setupのパラメータに次の行を追加することです:

setup(
    # ... 
    namespace_packages = ["root"] 
) 

問題の例の残りの部分は正しいです。

-2

私はちょうどあなたの例を試してみましたが、あなたがそれを望むようにに動作しているようです:私はrootフォルダを含むディレクトリからPythonインタプリタを実行した

>>> from root.sub.actualcode import foo 
    >>> foo() 
    Bar! 

。私は、空の__init__.pyファイルを作成し、私のactualcode.pyは次のようになります。

#!/bin/python3 

    def foo(): 
     print("Bar!") 

差が私の__init__.pyファイルが空であることです。

+0

しかし、それは同じルート名前空間を持つ別のプロジェクトではうまくいかないでしょう。 – deamon

+0

このソリューションはここに投稿されたケースを嫌っていますが、見つけようとした一般的な解決策ではありません。 – Philipp

+0

重要な詳細は「名前空間パッケージ」です。 – deamon