3.24. パッケージ化¶
Pythonでも自ら作成したモジュールなどをパッケージ化することができます。 パッケージ化によって、モジュールの整理や名前の衝突が避けられるようになりますので是非とも覚えておきましょう。
3.24.1. パッケージの基礎¶
Pythonでは異なるファイル間では名前が共有されません。ファイルを分割すれば名前の衝突はおきません。 異なるファイルは import で参照しファイル中のモジュールは「パス.名前」という記述で参照します。
1 2 | def func1():
print("func1")
|
1 2 3 4 5 6 7 | import file1
def func1():
print ("here")
func1()
file1.func1()
|
test1.pyの実行結果
1 2 | here
there
|
このようにtest1.pyの中のfunc1とfile1.pyの中のfunc1はそれぞれ独立に参照することができ、file1.func1という表記でfile1.pyの中のfunc1を参照することができます。
from path import name
という表記も使えます。
1 2 3 4 5 6 7 8 9 10 11 | # func1をfile1からインポートする
from file1 import func1
# file1のfunc1が参照される
func1()
# func1を定義する
def func1():
print ("here")
# ローカルなfunc1が参照される
func1()
file1.func1()
|
test2.py の実行結果
1 2 3 4 5 6 | there
here
Traceback (most recent call last):
File "test2.py", line 11, in
file1.func1()
NameError: name 'file1' is not defined
|
from file1 import func1
の後ではfunc1 と記述するだけで file1.py中のfunc1が参照されます。ただし同じファイル内にfunc1が定義されればそちらが優先され、file1.func1という参照方法は使用できません。
3.24.2. sys.pathの使い方¶
特に指定しない場合、モジュールは以下のフォルダから探索します。
- カレントディレクトリ
- sys.path に含まれるパス
sys.pathはリストであり、sys.pathの値はpython実行中
1 | print(sys.path)
|
で得られます
通常、sys.path は標準パッケージが含まれるフォルダをすべて含んでいます。しかしそれ以外のフォルダを探索するように sys.path にパスを追加することもできます。
1 | sys.path.append('追加するパス')
|
この時windowsでは「¥」や「」をパスに使いますが、sys.path.appendに指定する場合それらは「/」で置き換えてください。 今回インポートを行う「calc」モジュールのコードは下記の通りとなります。「c:/python3/com/python3」へ配置してください。
3.24.3. sys.path からのimportの実行例¶
ここでは実際に自分でパッケージを作成し、sys.path.appendを使ってパスを追加してパッケージをimportしてみます。
以下では、 .. code-block:: python
> PC > ドキュメント > folder3
にパッケージを作成しますが、このフォルダの絶対的なパスはユーザIDによって異なりますので、仮にユーザIDをTaro として表記します。自分の環境で確認する場合は Taro を自分のユーザーIDに読み替えてください。
まず、
> PC > ドキュメント
に folder3 フォルダを作成して、その中に以下の module3.py を作成してください。
> PC > ドキュメント > folder3
1 2 | def func3():
print('I am Gloot.')
|
次に、そのパスを確認します。エクスプローラのアドレスバーでフォルダのパスを取得すると、以下のようなパスが得られるはずです。
C:\User\Taro\folder2
Taro は自分のユーザIDに読み替えてください。
「¥」や「」は「¥¥」や「/」で置き換えるのでこのパスを追加する命令はたとえば、
1 | sys.path.append('C:/Python/Taro/folder2')
|
となります。
python コンソールで以下を実行すると、
1 2 3 4 5 | import sys
sys.path.append('C:/Users/Taro/Documents/folder3')
import module3
module3.func3()
|
以下が表示されます。
1 | I am Groot
|
sys.path.appendによって folder3 が探索範囲に加えられ、module3.py が import され、func3 が実行されたことがわかります。
以下によっても同じ結果が得られます。、
1 2 3 4 5 | import sys
sys.path.append('C:/Users/Taro/Documents/folder3')
from module3 import func3
func3()
|