2012-01-16 5 views
3

私はPythonモジュールは、ディレクトリのトップレベルの機能runとサブモジュールrunの両方を持っている(すなわち、パッケージ)として実装されている場合は、私はいつもの機能をインポートするには、from example import runに数えることができますか? Python 2.6とLinuxでのJython 2.5の場合のテストに基づいていますが、これを一般的に評価できますか?輸入の優先順位に関する情報を検索しようとしましたが、何も見つかりませんでした。モジュール 'example'に関数 'run'とサブモジュール 'run'の両方が含まれている場合、 'from example import run'を常にカウントすることができますか?

背景:

私は、人々は一般的に、コマンドラインからツールとして実行し、かなり大規模なパッケージを持っているだけでなく、時にはプログラムで使用します。

example/__init__.py

def run(*args): 
    print args # real application code belongs here 

example/run.py:私は両方の用途のためのシンプルなエントリー・ポイントを持っており、このようにそれらを実装することを検討したいと思います

import sys 
from example import run 
run(*sys.argv[1:]) 

最初のエントリ・ポイントのユーザーがアクセスすることができますPythonのモジュールは次のようになります:

from example import run 
run(args) 

後者のエントリポイントは、ユーザーが以下のアプローチの両方を使用して、コマンドラインからモジュールを実行することができます:

python -m example.run args 
python path/to/example/run.py args 

この素晴らしい作品と私​​は必要なすべてをカバーして両方。これを実際に使用する前に、すべてのオペレーティングシステムでPythonのすべての実装で動作することが期待できる、健全なアプローチであることを知りたいと思います。

答えて

2

これはいつもうまくいくと思います。関数定義はモジュールをシャドーします。

しかし、これも汚いハックとして私を襲う。あなたのいくつかのクレイジーな理由であれば、これは動作しないでしょう

# run.py 
def run(*args): 
    print args # real application code belongs here 

if __name__ == "__main__": 
    run(*sys.argv[1:]) 
+0

唯一の方法のようになります。これを行うにはきれいな方法は

# __init__.py # re-export run.run as run from .run import run 

すなわち、run.pyで実行中のすべてのロジックと、__init__.py最小限になりますdef a(): pass import aを – Bogdan

+0

としてインポートすると、このようなコードが整理されます。私はそれが私が持っているいくつかの他の制約と一緒に働くと思う必要があります。そのアプローチを使用する必要がある場合、関数定義が常にモジュールをシャドウすることも知っておくとよいでしょう。 –

関連する問題