3.24. パッケージ化

Pythonでも自ら作成したモジュールなどをパッケージ化することができます。 パッケージ化によって、モジュールの整理や名前の衝突が避けられるようになりますので是非とも覚えておきましょう。

3.24.1. パッケージの基礎

Pythonでは異なるファイル間では名前が共有されません。ファイルを分割すれば名前の衝突はおきません。 異なるファイルは import で参照しファイル中のモジュールは「パス.名前」という記述で参照します。

file1.py
1
2
 def func1():
   print("func1")
test1.py
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

という表記も使えます。

test2.py
 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の使い方

特に指定しない場合、モジュールは以下のフォルダから探索します。

  1. カレントディレクトリ
  2. 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
module3.py
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()