モジュールは、
直接インポートのようにインポートするには、通常、文書のモジュールです。モジュールのファイルタイプは"ピョ"、 "の.py"あるとして使用することができ 、 "PYC"、 "Pydの"、 "だから"、 "DLL"。
二つのパッケージは、
通常、常にパッケージディレクトリ、パッケージをインポートするために+インポートモジュールからインポートインポートパッケージ、またはその一部に使用することができます。向かった次のパッケージディレクトリは、ファイル__init__.pyです。そして、いくつかのモジュールのファイルとサブディレクトリ、サブディレクトリが存在する場合、それは、このパッケージのサブパッケージであるを__init__.py。
モジュール
:次のような、モジュールにソースファイルにインポート文を使用することができます
# file : spam.py
a = 37 # 一个变量
def foo: # 一个函数
print "I'm foo"
class bar: # 一个类
def grok(self):
print "I'm bar.grok"
b = bar() # 创建一个实例
モジュールとしてこのファイルをインポートすることができ書のインポートスパムを使用してください。あなたはモジュールシステムをインポートすると、以下の3つのことを実行します。
ソースコードファイルで定義されたオブジェクトのための名前空間を作成します。1.あなたは、名前空間によってモジュールで定義された関数や変数にアクセスすることができます。
2.新しく作成された空間の内部の名の下にソースコードファイルを実行します。
3.あなたは、このオブジェクトモジュールの関数や変数を介してアクセスできるように、ソースオブジェクトコード、オブジェクト参照モジュールの名前空間という名前のファイルを作成し、よう:
import spam # 导入并运行模块 spam
print spam.a # 访问模块 spam 的属性
spam.foo()
c = spam.bar()
...
:あなたは、モジュール名は、カンマで区切られ、同時に複数のモジュールをインポートすることができます
インポートソケットは、参照されるオブジェクトの名前を変更するには、モジュールをインポートするには、キーワードのOS、正規表現モジュールとして使用することができます。
import os as system
import socket as net, thread as threads
system.chdir("..")
net.gethostname()
あなたは、オブジェクトを参照するために名前空間モジュールを作成しますが、インポートされたモジュールまたは複数のオブジェクトに直接、現在の名前空間にしていない文から直接、現在の名前空間にオブジェクトの声明からモジュールを使用することができます。
from socket import gethostname
# 将gethostname放如当前名字空间
print gethostname() # 直接调用
socket.gethostname() # 引发异常NameError: socket
声明からカンマで区切られたオブジェクトをサポートし、あなたはまた、モジュールに加えて、すべてのオブジェクトの代わりに、アスタリスク(*)を使用することができますアンダースコアで始まります。
from socket import gethostname, socket
from socket import * # 载入所有对象到当前名字空间
しかし、モジュール場合は、モジュールのインポートから、その後、__all__のリストを定義した場合*文しかできインポートオブジェクト__all__リストが存在します。
# module: foo.py
__all__ = [ 'bar', 'spam' ] # 定义使用 `*` 可以导入的对象
また、としても組み合わせてから使用することができます。
from socket import gethostname as hostname
h = hostname()
import文は、プログラム内の任意の時点で使用することができ、あなたはプログラムで同じモジュールを複数回インポートしますが、コードモジュールできるモジュールが最初にインポートされたとき*のみ*実行。import文の裏には、単に唯一のモジュール名前空間の参照を作成します。sys.modules辞書は、すべてのモジュールがマッピングモジュールオブジェクトにモジュールをインポートして保持しています。この辞書は、モジュールの最新コピーをインポートするimport文を使用する必要があるかどうかを判断するために使用されている。
モジュールのインポート* FROM文が唯一のモジュールのトップレベルのために使用することができます* *特別注:により紛争の範囲には、機能では許可されていません声明から。
各モジュールは、コンテンツモジュール名の文字列である__name__性質を持っています。トップレベルのモジュール名は、コマンドラインまたはモジュール内の__main__における対話モードを実行__main__である。財産の__name__の使用、我々は同じプログラムが別の機会に(別々に実施または導入)していることができます異なりますこれを行うには、以下のように振る舞い、:
# 检查是单独执行还是被导入
if __name__ == '__main__':
# Yes
statements
else:
# No (可能被作为模块导入)
statements
パスを検索するモジュール
のモジュールをインポートする際、通訳を検索のsys.pathリストを、このリストには、ディレクトリのリストを保持しています。sys.pathリストの典型的な値:
Linux:
['', '/usr/local/lib/python2.0',
'/usr/local/lib/python2.0/plat-sunos5',
'/usr/local/lib/python2.0/lib-tk',
'/usr/local/lib/python2.0/lib-dynload',
'/usr/local/lib/python2.0/site-packages']
Windows:
['', 'C:\\WINDOWS\\system32\\python24.zip', 'C:\\Documents and Settings\\weizhong', 'C:\\Python24\\DLLs', 'C:\\Python24\\lib', 'C:\\Python24\\lib\\plat-win', 'C:\\Python24\\lib\\lib-tk', 'C:\\Python24\\Lib\\site-packages\\pythonwin', 'C:\\Python24', 'C:\\Python24\\lib\\site-packages', 'C:\\Python24\\lib\\site-packages\\win32', 'C:\\Python24\\lib\\site-packages\\win32\\lib', 'C:\\Python24\\lib\\site-packages\\wx-2.6-msw-unicode']
空字符串 代表当前目录. 要加入新的搜索路径,只需要将这个路径加入到这个列表.
インポートおよびコンパイルするためのモジュール
今までは、この章のモジュールはPythonのソースコードが含まれたテキストファイルですが、モジュールに限定されるものではなく、モジュールは、次の4つのカテゴリの合計インポートするimport文を指定できます
プログラム(の.pyファイルを•Pythonで書かれて使用して)
(共有ライブラリやDLLファイルとしてコンパイル)•CまたはC ++の拡張機能
•パッケージ(複数のモジュールを含んでいます)
•ビルトインモジュール(Cで書かれており、Pythonインタプリタにリンク)
場合は、クエリモジュールfooという、ファイルを検索するディレクトリのsys.pathためのリストに従ってインタプリタ(ファイルがディレクトリファイルである):
1.パッケージディレクトリfooの定義
2.foo.so、foomodule.so、foomodule.sl、またはfoomodule.dll(コンパイル済みの拡張機能)
(-Oまたは-OOオプションを使用してのみ)3.foo.pyo
4.foo.pyc
5.foo.py
モジュールが最初に導入されたときに、後にインポート操作が直接ファイルを読み込むに.pycの.pyファイルの場合、それは同じ名前のファイルにバイトコード、バイトコードにコンパイルされるに.pycインタプリタ-Oオプション、ファイル名の拡張子.pyoと同じ名前が使用されていないの.pyファイル(変更日は、ファイルの更新をの.pyない限り、この状況がする.pycファイルを再生成します)。ピョファイルの内容が、また、無視されます。行番号、アサーション、およびその他のデバッグ情報のバイトコードを削除し、より小さく、より速く実行します。あなたの代わりに-Oの-OOオプションを使用すると、文書はまた、ファイル.pyo文字列が作成されます
場合にすべてのパスが失敗したルックアップのsys.pathで提供され、インタプリタは、それが再び失敗した場合、内蔵モジュール、はImportErrorが送出されます。を見ていきます
コンパイル.pycファイルや.pyo文書、およびimport文を実行する場合にだけ。
import文は、ファイルを検索するには、ファイル名は大文字と小文字が区別されます。でも、大文字と小文字を区別しないファイルシステムシステム、あまりにも(Windowsの、など)で。このように、輸入fooはファイルのみをインポートしますFOO.PY. foo.pyではありません
再インポートモジュール
..:1)が内蔵された機能のリロード(、モジュールをインポートするimport文で更新されている場合は、モジュールを再インポートおよび更新コードを実行することができ、それは例えば、パラメータとして、モジュールオブジェクトを必要とする
インポートfooの
...いくつかのコード...
リロード(FOO)#逆輸入FOO
リロードでは()の動作は、新しいインポートコードを使用した後のモジュールのために実行されますが、リロード()は、オブジェクトの作成を使用して、古いモジュールを更新しませんので、オブジェクトが表示されるの新旧バージョンの共存の場合もあります。* CまたはC ++コンパイラ・モジュールの使用は、再インポートする()関数を再ロードすることはできません。原則として、デバッグおよび開発プロセスの間を除き、リロード()関数を使用しないでください。
包み込む
複数のモジュールと、維持し、使用するために、パッケージを閉じるために組織化されるべきです。この技術は、効果的に名前空間の競合を回避することができます。パッケージの定義上のフォルダに__init__.pyファイルを作成するために、パッケージのフォルダとファイル名の名前を作成します。あなたは、フォルダ内にコンパイル延長し、サブパッケージをリソースファイルを格納する必要があるかもしれません。たとえば、パッケージには、次のような構造を持っていることがあります。
Graphics/
__init__.py
Primitive/
__init__.py
lines.py
fill.py
text.py
...
Graph2d/
__init__.py
plot2d.py
...
Graph3d/
__init__.py
plot3d.py
...
Formats/
__init__.py
gif.py
png.py
tiff.py
jpeg.py
import文のパッケージ・モジュールは、次の方法を使用しています:
* Graphics.Primitive.fillインポートモジュールGraphics.Primitive.fill、フルネームを導入するモジュールの属性をのみアクセスすることができ、例えばGraphics.Primitive.fill.floodfill(IMG、X、 Y、色)。
* Graphics.Primitive塗りつぶし塗りつぶしインポートモジュールから、唯一の塗りつぶしへのインポート。この属性name属性アクセスモジュール、例えばfill.floodfill(IMG、X、Y、色)。
* Graphics.Primitiveから。フィル充填インポートが現在の名前空間にモジュール、および機能FLOODFILLをインポートFLOODFILL、プロパティへの直接アクセスは、例えばFLOODFILL(IMG、X、Y、導入される色)。
パッケージの一部が導入されたどんなに、ファイル内のコードが実行されると、__init__.py。このファイルの内容は、空のことができますが、通常は、パッケージの初期化コードを格納するために使用されます。すべての__init__.pyファイルインポートプロセスの出会いは、実行されそうGraphics.Primitive.fillシーケンシャル文をインポートするフォルダ__init__.pyファイルとグラフィックスプリミティブを実行しました。
この文は、次のあいまいさがあります。
Graphics.Primitiveインポートから*
この文の本来の目的は、現在の名前空間にGraphics.Primitiveパッケージ内のすべてのモジュールにあるしかし、異なるプラットフォーム間の差に起因するには、大文字と小文字を区別として、(ルールをファイル名。問題)、Pythonが正しくインポートされるべきモジュールを判断することはできません。この文は唯一のために__init__.pyファイルとグラフィックスプリミティブのフォルダを実行します。この問題を解決するために、以下のプリミティブフォルダに__init__.pyで定義する必要があります例えば、すべての名前のリスト、:
#グラフィックス/プリミティブ/ __ init__.py
__all__ = [ "行"、 "テキスト"、 "塗りつぶし"、...]
このように、文の最上部には、すべてのモジュールのリストをインポートすることができます。
次の文は、唯一のグラフィックディレクトリに__init__.pyファイルを実行しますが、任意のモジュールをインポートしません:
インポートグラフィックス
Graphics.Primitive.fill.floodfill(IMG、X軸、Y軸、色)#失敗します!
しかし、グラフィックスディレクトリ文でインポート__init __ .. pyのファイルは、グラフィックスを実行するために、我々はこの問題を解決するために、次の措置をとることができます:
#グラフィックス/ __ init__.py
インポートプリミティブ、Graph2d、Graph3d
#グラフィックス/プリミティブ/ __ init__.py
インポートライン、塗りつぶし、テキスト、...
このような文のインポートグラフィックスサブモジュール(これらのモジュールにアクセスするための完全な名前を持つことができる唯一の属性)のすべてをインポートすることができます。
スリーのsys.pathとsys.modules
sys.pathは、モジュール検索パスが含まれています。
辞書のsys.modulesは、(組み込みモジュールが含まれている)現在の負荷のすべてのモジュールが含まれています。
完成!