python3モジュール
スクリプトの前のセクションでは、あなたが終了して、Pythonインタプリタから入力した場合、その後、あなたが定義するすべてのメソッドと変数が消えているだろう、私たちをプログラムするPythonインタプリタです。
Pythonはこれを行う方法を提供し、いくつかのスクリプトまたは対話型インタプリタインスタンスのファイルに格納されているこれらの定義は、このファイルには、モジュールと呼ばれています。
モジュールは、名前サフィックスの.py関数と変数が含まれているすべてのファイルの定義です。 モジュールは、このモジュールの機能および他の機能を使用する他のプログラムに導入することができます。 これはまた、Pythonの標準ライブラリを使用することです。
ここで使用されるPython標準ライブラリモジュールの一例です。
#!/usr/bin/python3 # 文件名: using_sys.py import sys print('命令行参数如下:') for i in sys.argv: print(i) print('\n\nPython 路径为:', sys.path, '\n')
以下のような結果の実装は以下のとおりです。
$ python using_sys.py 参数1 参数2 命令行参数如下: using_sys.py 参数1 参数2 Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
- 1、インポートsysはPythonの標準ライブラリsys.pyモジュールを導入し、これは、モジュールアプローチの導入です。
- 2は、sys.argvのが含まれているコマンドラインスイッチの一覧です。
- 3、のsys.pathはPythonインタプリタが自動的に必要なモジュールのリストのパスを見つけることが含まれます。
import文
次のようにPythonのソースファイルを使用する場合は、単にソースファイル内の別のimport文を実行し、構文は次のとおりです。
import module1[, module2[,... moduleN]
モジュールは、現在の検索パスにインポートされる場合、インタプリタは、import文を検出すると。
検索パスは、最初にすべてのディレクトリのリストを検索するインタプリタです。 あなたはモジュールのサポートをインポートすると、あなたのスクリプトの先頭に注文する必要があります。
support.pyファイルのコードです:
#!/usr/bin/python3 # Filename: support.py def print_func( par ): print ("Hello : ", par) return
test.pyはサポートモジュールが導入されました:
#!/usr/bin/python3 # Filename: test.py # 导入模块 import support # 现在可以调用模块里包含的函数了 support.print_func("w3big")
上記の出力の例:
$ python3 test.py Hello : w3big
モジュールは関係なく、インポートを実行する回数を、一度にインポートされません。 これは、インポートモジュールは、何度も繰り返し実行されないようにします。
私たちはPythonインタプリタである場合には、importステートメントを使用するとどのように対応するファイルを見つけるには?
これは、Pythonの検索パスを伴う、検索パスがディレクトリ名のシリーズで構成され、Pythonインタプリタは、導入モジュールを検索するためにこれらのディレクトリからになります。
これは、実際には、検索パス環境変数の方法を定義することによって決定することができる、環境変数のように見えます。
検索パスを決定Pythonのコンパイラやインストールされ、新しいライブラリをインストールし、また変更する必要があります。 検索パスは、次のコードを入力し、対話インタプリタで簡単な実験を行い、sysモジュールパス変数に格納されます。
>>> import sys >>> sys.path ['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] >>>
sys.pathは、出力のリストである、空の文字列である最初のもの ''、我々はPythonインタプリタを実行していること、(スクリプトからプリントアウトすれば、あなたがより明確にするディレクトリを参照してくださいすることができます)は、現在のディレクトリを表しディレクトリ(スクリプトがスクリプトが実行されているディレクトリである場合)。
私は、ファイルと同じ名前で現在のディレクトリに存在するようにモジュールに導入されるのであれば、モジュールが遮断するために導入されます。
検索パスの概念を理解し、あなたではなく、モジュールの検索パス内のいくつかを紹介するスクリプト内のsys.pathを変更することができます。
さて、現在のディレクトリまたはfibo.pyファイルを作成するディレクトリを適宜sys.pathインタプリタで、次のように:
# 斐波那契(fibonacci)数列模块 def fib(n): # 定义到 n 的斐波那契数列 a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() def fib2(n): # 返回到 n 的斐波那契数列 result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result
そして、Pythonインタプリタを入力して、このモジュールをインポートするには、次のコマンドを使用します。
>>> import fibo
これは、直接現在のシンボルテーブルに書き込まれている関数の名前でFIBOで定義されていますが、モジュール名FIBOはそこに書かれていません。
あなたは機能にアクセスするためにモジュール名を使用することができます。
>>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ 'fibo'
あなたは、多くの場合、機能を使用する場合は、ローカル名に割り当てることができます:
>>> fib = fibo.fib >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
... import文
Pythonは、モジュールから現在の名前空間の特定の部分からステートメントをインポートすることができ、次のように、構文は次のとおりです。
from modname import name1[, name2[, ... nameN]]
例えば、FIB機能のモジュールFIBOをインポートするには、次のステートメントを使用します。
>>> from fibo import fib, fib2 >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
この文は、現在の名前空間に全体FIBOモジュールではありません、それだけで導入レーン嘘機能をFIBOます。
...インポート*ステートメント
モジュールのすべての内容は、現在のすべての名前空間にあるだけで次の文を使用し、可能です。
from modname import *
これは、すべてのプロジェクトにモジュールをインポートする簡単な方法を提供します。 しかし、このステートメントを使用するのが多すぎるべきではありません。
深さモジュール
メソッド定義のモジュールに加えて、実行可能なコードを含むことができます。 これらのコードは、一般的に、モジュールを初期化するために使用されます。 初回のみが導入されている。このコードが実行されます。
各モジュールは、グローバル・シンボル・テーブルとしてすべての機能で使用するモジュール内、独自の独立したシンボルテーブルを持っています。
したがって、モジュールの作者は、安全にグローバル変数花に従事し、他のユーザーを気にすることなく、モジュール内のこれらのグローバル変数を使用することができます。
あなたが本当に何をやっている知っている別の観点からは、あなたもmodname.itemnameような表現により、機能モジュールにアクセスすることができます。
モジュールが他のモジュールをインポートすることができます。 モジュールでは(またはスクリプト、または他の場所)モジュールをインポートする一番の使用インポート、もちろん、これは単なる慣習ではなく、必須です。 インポートされたモジュールの名前は、モジュールの現在の動作のシンボルテーブルに配置されます。
インポートが現在の動作モジュールにモジュール名(変数の関数)内で直接使用することができ、インポートする方法もあります。 例えば:
>>> from fibo import fib, fib2 >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
モジュール名をインポートしません。このメソッドは、現在の文字テーブルで導入されている(内部この場合には、名前が定義されていないFIBOので)。
また、これはすべて(関数、変数)の名前は現在の文字テーブルモジュールにインポートされているワンタイム・モジュールを配置する方法です。
>>> from fibo import * >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
これは、すべての名前をインポートしますであるが、1つのアンダースコア(_)名前のものがこの場合にありません。 他のソースから導入された名前は、既存の定義をカバーする可能性があるため、ほとんどのケースでは、Pythonプログラマは、このメソッドを使用しないでください。
__name__属性
モジュールが最初に別のプログラムを導入した場合、メインプログラムが実行されます。 我々はモジュールで導入する場合は、モジュールはプログラムブロックを実行していない、我々はこのブロックが唯一のランタイムモジュール自体で実行されていることを確認するために__name__属性を使用することができます。
#!/usr/bin/python3 # Filename: using_name.py if __name__ == '__main__': print('程序自身在运行') else: print('我来自另一模块')
次の出力を実行します。
$ python using_name.py
自身が実行しているプログラム
$ python >>> import using_name 我来自另一模块 >>>
説明:その値が'__main__'がある場合、各モジュールは、__name__属性を有し、それ自体が実行されているモジュールは、そうでない場合は導入されていることを示します。
DIR()関数
内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回: </p> <pre> >>> import fibo, sys >>> dir(fibo) ['__name__', 'fib', 'fib2'] >>> dir(sys) ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions']
引数が指定されなかった場合は、DIR()関数は、現在定義されているすべての名前が一覧表示されます:
>>> a = [1, 2, 3, 4, 5] >>> import fibo >>> fib = fibo.fib >>> dir() # 得到一个当前模块中定义的属性列表 ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys'] >>> a = 5 # 建立一个新的变量 'a' >>> dir() ['__builtins__', '__doc__', '__name__', 'a', 'sys'] >>> >>> del a # 删除变量名a >>> >>> dir() ['__builtins__', '__doc__', '__name__', 'sys'] >>>
標準モジュール
Pythonライブラリリファレンスドキュメント内のモジュールの標準ライブラリの一部でのPython自体は(つまり、「ライブラリリファレンスドキュメント "の後ろにある)に導入されます。
一部のモジュールは、パーサに直接組み込まれている、これらの言語ではない、いくつかの組み込み機能しかし、彼はあっても、システムレベルの呼び出しは問題ありません、非常に効率的に使用することができました。
これらのコンポーネントは、Windowsシステムのみで使用可能になりますwinregをモジュールとして異なるオペレーティングシステムに基づいて、異なる形で構成することができます。
すべてのPythonパーサーに組み込まれている特殊モジュールSYSがあることに留意すべきです。 変数sys.ps1とsys.ps2のどちらをプライマリとセカンダリのプロンプトのプロンプト対応する文字列を定義しています。
>>> import sys >>> sys.ps1 '>>> ' >>> sys.ps2 '... ' >>> sys.ps1 = 'C> ' C> print('Yuck!') Yuck! C>
パッケージ
パッケージには、使用して、管理Pythonモジュールの名前空間の形である「ドット付きモジュール名を。」
例えば、モジュール名がABで、それから彼は、パッケージのサブモジュールBと言いました
モジュールを使用する場合は、このフォームで点線のモジュール名を使用するように、異なるモジュールの相互作用の中でグローバル変数を心配する必要はありません、同じ名前の異なるライブラリー間のケースモジュールを心配しないでください。
だから、別の著者は、numpyのモジュール、またはPythonのグラフィックライブラリを提供することができます。
例えば、あなたが、統一された音声処理モジュールおよびデータファイルを設計したいと仮定しましょう(または「パッケージ」とします)。
あなたは増加し、モジュールのセットのためを持っている必要がありますので、(.AU、:.WAV ,:ファイル:.aiffの,:ファイル例えば、基本的には拡張子で区別、)異なるオーディオファイル形式の既存の様々な異なるフォーマット間。
そして、オーディオデータについて、あなたはまた、これらの操作を処理するためのモジュールを終了しないかのセットを必要とする、(このような人工的なステレオ効果を作成するために、イコライザ機能を向上させる、エコーを追加し、混合など)さまざまな操作があります。
ここで(階層ファイル・システム内の)可能なパッケージ構造は、次のとおりです。
sound/ 顶层包 __init__.py 初始化 sound 包 formats/ 文件格式转换子包 __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ 声音效果子包 __init__.py echo.py surround.py reverse.py ... filters/ filters 子包 __init__.py equalizer.py vocoder.py karaoke.py ...
インポートでは、サブディレクトリに基づいてのPythonのsys.pathディレクトリがこのパッケージを見つけるために、パッケージが含まれています。
唯一のディレクトリには__init__.pyは主に名前の下品な虐待のいくつかを回避するために、パッケージとみなされるという名前のファイルが含まれている(例えば、文字列と呼ばれる)不注意が有効なモジュールの検索パスに影響を与えます。
それinit__.pyに__:ファイル:最も単純なケースでは、空を置きます。 もちろん、このファイルは、いくつかの初期化コードを含んでいてもよく、または__all__変数(後述)されています。
たびに、ユーザーは、次のようなパッケージ内のみ特定のモジュールをインポートすることができます。
import sound.effects.echo
これは、サブモジュールをインポートします:sound.effects.echo。 彼は、アクセスに完全な名前を使用する必要があります。
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
サブモジュールを導入するための別の方法は次のとおりです。
from sound.effects import echo
エコー、彼はそれらの長い接頭辞を必要としないので、彼は使用できます。また、サブモジュールをインポートします:
echo.echofilter(input, output, delay=0.7, atten=4)
もう一つの変化は、直接、関数や変数に導入されています。
from sound.effects.echo import echofilter
エコー、および彼のechofilter()関数を使用することができます。この場合も、この方法では、サブモジュールをインポートします:
echofilter(入力、出力、遅延= 0.7、ATTEN = 4)
このフォームで、パッケージのインポートアイテムから使用する場合に該当する項目はパッケージのサブモジュール(サブパッケージ)の内側のいずれかであることができるときにことに注意してください、またはこのような関数、クラスや変数などのパッケージ定義内の他の名前、。
最初のパッケージのように定義された項目名をインポートします構文が、見つからない場合は、インポートするモジュールに従うことを試みました。 見つからない場合は、お祝いの言葉、:EXC:はImportError例外がスローされます。
インポートitem.subitem.subsubitemインポート形式としてこのフォームを使用する場合は逆に、最後の1を除いて、それがパッケージでなければなりませんが、最後の1は、モジュールまたはパッケージすることができますが、クラス名、関数や変数にはできません。
パッケージからインポート*
我々はsound.effectsから使用している場合*何が起こるのだろうインポート想像してみ?
Pythonは、ファイルシステムを入力して、すべてのサブモジュール、一つずつ、それらのすべてがに来て、パッケージを見つけます。
Windowsは大文字と小文字を区別しないシステムですので、しかし、残念ながら、この方法は、Windowsプラットフォーム上で動作し、非常に良いではありません。
このプラットフォームでは、誰もモジュールエコーまたはエコーまたはECHOとしてインポートと呼ばれるECHO.pyファイルを保証することはできません。
(たとえば、Windows 95が表示されている各ファイルの最初の文字を大文字に非常に迷惑である)とDOS 8 + 3の命名規則は、より多くのもつれん長いモジュール名の問題に対処します。
この問題を解決するために、唯一の問題パッケージ作成者は、パッケージの正確な指標を提供します。
ルール次のimport文:__init__.py呼ばれるパッケージ定義ファイルは、パッケージのインポートコンテンツとして、このリスト内のすべての名前を入れて、パッケージのインポート*時間から使用して、変数のリストを__all__存在する場合。
パッケージの著者として、また更新されたああを__all__確保するために、更新パッケージの後に忘れてはいけません。 あなたは、私が*この使用法、大丈夫、何の問題は、なぜあなたは上司を行いませんでしたインポートを使用しません、私はそれを行うことはありませんと言います。 ファイル:ここでは、一例であり、サウンド/エフェクト/ __ init__.pyには、次のコードが含まれています。
__all__ = ["echo", "surround", "reverse"]
これは*インポートあなたがsound.effectsからこの使用法を使用する場合、あなたは3のサブモジュール内部のパッケージをインポートすることを意味します。
__all__が実際に定義されていない場合は、sound.effectsからこの構文を使用します*時間をインポートするには、パッケージsound.effects内の任意のサブモジュールをインポートしません。 彼はただ(__init__.py初期化コードを実行している可能性が定義されている)に来るように内側に定義されたパッケージとそのsound.effectsのすべての内容を置きます。
これは、に来て名前のすべてを定義するに__init__.pyます。 私たちはこの文を導入する前に、彼はすべて明示的に指定されたモジュールを破壊しません。 コードのこの部分を見てください:
import sound.effects.echo import sound.effects.surround from sound.effects import *
この例では、から...インポートを実行する前に、パッケージには、エコーやサラウンドモジュールを現在の名前空間にインポートされsound.effects。 (もちろん、あなたは__all__は問題を定義していない場合であっても)
通常、私たちはしばしば、この方法は減少可読性になりますので、モジュールをインポートするには、このメソッド*の使用を提唱していません。 しかし、これは多くの労力を節約することができますキーストロークは本当にであり、いくつかのモジュールは、特定のメソッドを介してのみインポートになるように設計されています。
間違ったことはありませんパッケージのインポートspecific_submoduleからこのメソッドを使用して、覚えておいてください。 実際には、この方法をお勧めします。 あなたはサブモジュールおよびサブモジュールをインポートする場合を除き、同じ名前の他のパッケージを有していてもよいです。
パッケージの構造は、(そのようなパッケージの例は、音のように)サブパッケージである、とあなたがインポートするインポートした絶対パスを使用する必要が兄弟パッケージ(同じレベルパッケージ)をインポートする場合。 あなたは、モジュールsound.filters.vocoderパッケージsound.effectsモジュールはエコー使用したい場合たとえば、あなたはsound.effectsから記述する必要がエコーインポートします。
from . import echo from .. import formats from ..filters import equalizer
暗黙的または明示的な相対的な輸入は、現在のモジュールの先頭からのものであるかどうか。 メインモジュールの名前は常に "__main__"、Pythonアプリケーションのメインモジュールであり、あなたは常に絶対パス参照を使用する必要があります。
パッケージには、追加のプロパティ__path__を提供します。 これは、あなたがああ__init__.pyで定義された他の前に実行する必要があり、このサービス__init__.py用のパッケージを含むディレクトリをそれぞれ有するディレクトリのリスト、です。 この変数は、パッケージと子パッケージに含まれるモジュール内の影響を修正することができます。
この機能は、一般に、典型的にはモジュール内のパッケージを拡張するために使用され、使用されません。