2017-08-02 6 views
1

は、私は、Python 3を使用して(それゆえ絶対輸入)午前言うと、私のディレクトリ構造は次のようになります。ファイルsub_dir_file.py__main__として使用され、別のディレクトリにあるファイルによってインポートされるファイルで、Pythonでモジュールをインポートする方法は?

> package: 
    > sub_directory 
     __init__.py 
     sub_dir_file.py 
     sub_dir_file2.py 
    __init__.py 
    main_dir_file.py 

私はsub_dir_file2.pyから機能をインポートしたいです。キャッチは、を__name__ == '__main__'main_dir_file.pyにインポートすることができます。したがって、sub_dir_file.pyに私は相対的インポートを使用する場合:とき__name__ == '__main__'

from .sub_dir_file2 import some_function 

モジュールはmain_dir_file.pyから実行するとき完全に細かい実行するが、相対インポートとして(直接実行されたときにエラーをスローすることは実行できないIしかし使用する場合。通常の絶対インポートは、sub_dir_file.pyはメインとして実行されますが、main_dir_file.pyからインポートすることはできません

この問題を解決するための最もエレガントな方法だろうどのような1つの明白な解決策があると思われる:。?

if __name__ == '__main__': 
    from sub_dir_file2 import some_function 
else: 
    from .sub_dir_file2 import some_function 

しかし、それは非常にpythonicようではありません。

答えて

1

相対インポート構文from .sub_dir_file2 import some_functionを使用するか、最終的に絶対構文from package.sub_directory.sub_dir_file2 import some_functionを使用する必要があります。

次に、パッケージサブモジュールの1つを呼び出すには、__main__モジュールとしてコンテンツを実行するために、Pythonインタプリタの-m optionを使用する方が簡単です。

検索という名前のモジュールのためのsys.pathと メインモジュールとして、その内容を実行します。

引数はモジュール名なので、ファイルには 拡張子(.py)を与えてはいけません。モジュール名は有効な絶対Python モジュール名である必要がありますが、実装では必ずしもこれを強制するとは限りません(例: 、ハイフンを含む名前を使用できるようにする)。例えば

> python -m package.main_dir_file 
> python -m package.sub_directory.sub_dir_file 
1

名前が__main__の場合は、main()関数を呼び出すことをお勧めします。とにかく、私が知っている限り、良い習慣です。

これで、インポートしたモジュールのmain()を呼び出すことができます。毎回ファイルを必ず実行することなく、モジュールのテストや再呼び出しを可能にするなど、他の利点もあります。

関連する問題