pythonのmodule

2948 ワード

PythonのModuleは比較的重要な概念である.よくあるのは、一つ書いておくことです.pyファイルは、別のファイルにimportが必要な場合は、事前に書きます.pyファイルを現在のディレクトリにコピーするかsys.pathには事前に書いたものを追加します.pyファイルがあるディレクトリ、そしてimport.このようなやり方は、少数のファイルでは可能ですが、プログラムの数が多く、階層が複雑であれば、大変です.仕方なく、JavaのPackageのように、複数になります.pyファイルを整理して、外部で統一的に呼び出し、内部で互いに呼び出しますか?答えはある.
この問題を理解するには、まず、Pythonがimport文を実行する際にどのような操作を行ったのかを知る必要があります.Pythonのドキュメントに従って、1つ目のステップで、新しいものを作成します.空のmoduleオブジェクト(複数のmoduleを含む可能性があります).2番目のステップでは、sys.moduleにこのmoduleオブジェクトを挿入します.3番目のステップでは、moduleのコードをロードします(必要に応じて、まずコンパイルする必要があります).4番目のステップでは、新しいmoduleの対応するコードを実行します.
手順3を実行するときは、まずmoduleプログラムが存在する場所を見つけます.その原理は、インポートするmoduleの名前がm 1である場合、解釈器はm 1を見つけなければなりません.pyは、まず現在のディレクトリで検索し、次に環境変数PYTHONPATHで検索します.PYTHONPATHは、いくつかのディレクトリを含むシステムのPATH変数のようなものと見なすことができる.PYTHONPATHが設定されていない場合、またはm 1が見つからない.pyは、Pythonのインストール設定に関連するデフォルトのパスを検索し続け、Unixでは通常/usr/local/lib/pythonです.実際には検索の順序は、現在のパス(および現在のディレクトリから指定されたsys.path)、次にPYTHONPATH、次にPythonのインストール設定に関するデフォルトパス.このような順序があるからこそ、現在のパスまたはPYTHONPATHに標準moduleと同じmoduleが存在する場合、標準moduleが上書きされる.すなわち、現在のディレクトリの下にxml.pyが存在する場合、import xmlを実行する際にインポートされるのは現在のディレクトリのmoduleは、システム標準のxmlではありません.
これらを理解すると、まずpackageを構築し、通常のmoduleでインポートすることができ、このpackageの各moduleに直接アクセスすることができます.
Pythonのpackageの定義は簡単で、その階層はプログラムが存在するディレクトリの階層と同じであることはJavaと似ています.唯一の違いは、Pythonのpackageには1つの__が含まれなければならないことです.init__.pyのファイル.例えばpackageを組織することができます
package1/    __init__.py     subPack1/        __init__.py         module_11.py         module_12.py         module_13.py     subPack2/        __init__.py         module_21.py         module_22.py     ……
__init__.pyは空で、存在する限り、このディレクトリがpackageとして処理されるべきであることを示します.もちろん、_init__.pyでは対応する内容を設定することもできますが、以下で詳しく説明します.
さあ、今moduleで11.pyで関数を定義します.
def funA():

    print "funcA in module_11"

    return

上位ディレクトリ(つまりpackage 1が存在するディレクトリ)でPythonを実行するには、上記の説明を参照してください.
>>>from package1.subPack1.module_11 import funcA

>>>funcA()

funcA in module_11

これにより、packageの階層関係に従ってmodule_を正しく呼び出します.11の関数です.
注意深いユーザーは、import文にワイルドカード*が表示され、あるmoduleのすべての要素をインポートすることがあることに気づきます.これはどのように実現されていますか?答えは_にあるinit__.pyで.私たちはsubPack 1の_init__.pyファイルに書く
__all__ = ['module_13', 'module_12']

そしてPythonに入ります
>>>from package1.subPack1 import *

>>>module_11.funcA()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ImportError: No module named module_11

つまり、*でインポートした場合、パッケージ内のmoduleは_init__.py制限.
では、最後にpackageの内部でどのように呼び出すかを見てみましょう.同じpackageのmoduleを呼び出す場合は、直接importでいいです.つまり、module_12.pyでは、直接使用できます
import module_11

同じパッケージにない場合は、例えばmodule_21.pyでmoduleを呼び出す_11 pyのFuncAは、次のようになります.
from package1.subPack1.module_11 import funcA

もちろん、Python 2.5では、より簡単な方法があります.
from .. subPack1.module_11 import funcA