パッケージの作成、呼び出し方法

11.3 パッケージの作成、呼び出し方法

モジュールの作成、呼び出し方法を確認しましたが、同一のフォルダに限定した説明となっておりました。
では他のフォルダからモジュールを呼び出すためにはどうすれば良いのでしょうか?

そのためには呼び出し先のフォルダをパッケージ化する必要があり、以下ではパッケージの作成方法を踏まえた上で、他のフォルダからモジュールを呼び出す方法を説明します。

11.3.1 パッケージの作成方法

パッケージ作成の手順は以下の2点です。

パッケージ作成手順
① 対象のフォルダを用意する※当テキストでは「chapter11/」を利用する
② 対象のフォルダに「__init__.py」ファイルを作成する

フォルダについては「chapter11//」が既に用意されてますので、当テキストではJupyterNotebookを介して「__init__.py」ファイルの作成方法について解説していきます。

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座/chapter11/
ファイル名: MakeModule.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/chapter11/MakeModule.ipynb

対象のフォルダに「__init__.ipynb」を作成する

まず「chapter11//」フォルダにて「__init__.ipynb」を作成します。

■①新規ファイルを作成する

「Python基礎講座 > chapter11//」を開いたら、左上の「New」→「Python3」の手順にボタンをクリックして新規の「Untitled.ipynb」を作成します。

図 11.3.1 : 新規ファイルの作成

■②ファイル名の変更

「Untitled.ipynb」というファイルが追加されたら、今度はファイル名を「Untitled.ipynb」から「__init__.ipynb」に変更します。
以下の図のように「Untitled.ipynb」を開きます。

図 11.3.2 : ファイルの確認

「Untitled.ipynb」のファイルを開いたら、左上の「File」→「Rename」の順番にクリックします。

図 11.3.3: ファイルのリネーム①

「Untitled」を「__init__」に書き換えたら「Rename」をクリックします。

図 11.3.4: ファイルのリネーム②

モジュールファイル(.py)に変換

ファイル名の変更ができましたら、今度は「__init__.ipynb」から「__init__.py」に拡張子を変更します。

■①モジュールファイル(.py)への変換とダウンロード

ファイルの生成は、左上の「File」を選択し、「Download as」の「Python(.py)」を選択してください。

図 11.3.5 : .pyファイルのダウンロード

■②モジュールファイルのアップロード

ダウンロードフォルダを確認すると「__init__.py」が保存されております。続いて「__init__.py」を対象のフォルダ(/Desktop/Python基礎講座/chapter11/)へ保存します。
JupyterNotebookで「/Desktop/Python基礎講座/chapter11/」フォルダを開いたら、右上の「Upload」ボタンをクリックし、ダウンロードフォルダから「__init__.py」を選択してください。

図 11.3.6:モジュールファイルのアップロード

■③モジュールファイルの追加の確認

ファイルの追加が確認できたら、無事アップロードができたということになります。

図 11.3.7:モジュールファイルのアップロードの確認

11.3.2 同一フォルダ内のモジュールファイルの呼び出し

パッケージの作成方法を学んだところで、今度は他のフォルダ(パッケージ)からモジュールファイルを呼び出すにはどうすれば良いのでしょうか?

書式:フォルダ外からのモジュールの呼び出し

    from パッケージ名 import ファイル名 as 略称
	

他のフォルダ(パッケージ)からモジュールを呼び出すためには、import文にfrom文を付け加えます。fromの後にパッケージ名を持ってくることで、他のフォルダからモジュールを呼び出すことができます。

書式:「chapter11/MakeModule.py」の呼び出し

    from chapter12 import MakeModule as mm
	

11.3.3 他のパッケージのモジュールファイルの呼び出しのプログラム

他のパッケージからモジュールを呼び出す方法を確認したところで、今度は「Python基礎講座/第11章.ipynb」から「chapter11/MakeModule.py」を呼び出すプログラムを実行します。

【呼び出し先のファイル】

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座/chapter11/
ファイル名: MakeModule.py
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/chapter11/MakeModule.py

    #!/usr/bin/env python
    # coding: utf-8

    # In[ ]:


    def sample1():
        print('sample1')

    def sample2():
        print('sample2')

    hensu = 'test'
	

【実行ファイル】

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座/
ファイル名: 第11章.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/第11章.ipynb

    from chapter11 import MakeModule as mm

    mm.sample1()
    mm.sample2()
    print(mm.hensu)
	

実行結果

	sample1
	sample2
	test
	

解説

1行目で「chapter11」パッケージの中にある「MakeModule.py」の呼び出しを行っております。

    from chapter11 import MakeModule as mm
	

「 from chapter11」となっているので、呼び出し先が「chapter11」パッケージの中にあるモジュールに限定されてます。

図 11.3.8 : 他のパッケージからモジュールの呼び出し

略称として「as mm」と指定しているため、以下の文ではこちらのモジュールを「mm」で呼び出すことができます。

3~5行目で「MakeModule.py」に含まれている、sample1()関数、sample2()関数、hensu変数を呼び出しているため上記のような実行結果になります。

    mm.sample1()
    mm.sample2()
    print(mm.hensu)
	

図 11.3.9 : モジュールの呼び出し

11.3.4 あらゆる階層のモジュールファイルの呼び出し

他のパッケージのファイルの呼び出しといっても、「Pythoon基礎講座」フォルダ直下のファイルから、「Pythoon基礎講座」フォルダ内のフォルダ(chapter11)のファイルを呼び出したに過ぎません。

図 11.3.10 : パッケージからモジュールの呼び出しの例

モジュールの呼び出しを行う上で階層関係は上記の内容に限定されるとは限らないので、以下の図のようにあらゆる階層状況に応じてモジュールを呼び出せた方が良いでしょう。

図 11.3.11 : 階層が異なるパッケージからモジュールの呼び出し

では上記の図のようにあらゆる階層状況に応じてファイルを呼び出すにはどうすれば良いのでしょうか?

書式:フォルダ外からのモジュールの呼び出し

    import sys

    sys.path.append('/親フォルダ名/子フォルダ名/…./パッケージ名')

    import モジュール名 as 略称
	

あらゆる階層状況にあるフォルダのモジュールを呼び出すためには、対象のファイルのパスを、sys.path.append()の引数に指定します。
パスを指定したら後は通常のインポートと同じ流れです。
またフォルダの指定には絶対パス(フォルダ名を全て記載する方法)と相対パス(共通するフォルダから順にフォルダを指定する方法)に分けることができますが、絶対パスではなくプロジェクトで使用されるフォルダの相対パスで記載することをおすすめします。
他のPCでファイルを開く際、プロジェクトのフォルダの保管場所によって絶対パスの内容が変わってしまうからです。

図 11.3.12 : 階層が異なるパッケージからモジュールの呼び出し

例えば上記の図のように他のPCに、あるプロジェクトのフォルダを移す際、元のPCでは「Desctop」フォルダに保存していたところ、移した先のPCでは「Download」フォルダだった場合、絶対パスの内容が異なってしまいます。
絶対パスで指定していた命令文は正しく機能しないため、必ず相対パスで記載するように気を付けてください。

そのためには以下のように同階層を基準にパスを指定する方法と、上の階層からパスを指定する方法を覚えると便利です。

書式:同階層を基準に指定する方法

    import sys

    sys.path.append('./フォルダ名/ファイル名')

    import モジュール名 as 略称
	

同階層を指定するためには、「./フォルダ名またはファイル名」といった具合に、先頭文字にドット「.」を一つ指定します。

凡例:「Python基礎講座」内のファイルから「chapter11/MakeModule.py」の呼び出す

    import sys

    sys.path.append(' ./chapter11')

    import  MakeModule as mm
	

そのため「Python基礎講座」内のファイルから、「Python基礎講座」内の「chapter11」フォルダ直下のファイルを呼び出すことができます。

書式:一つ上の階層を基準に指定する方法

    import sys

    sys.path.append('../フォルダ名/ファイル名')

    import モジュール名 as 略称
	

同階層を指定するためには、「../フォルダ名またはファイル名」といった具合に、先頭文字にドット「.」を二つ指定します。

凡例:「Python基礎講座/otherdirectory/」から「Python基礎講座/chapter11/MakeModule.py」の呼び出す

    import sys

    sys.path.append('. ./chapter11')

    import  MakeModule as mm
	

「otherdirectory」フォルダにとって「Python基礎講座」は一つ上の階層ですので、「sys.path.append(‘. ./chapter11’)」によって「Python基礎講座/chapter11」を指定したことになります。

11.3.5 あらゆる階層のモジュールファイルの呼び出しのプログラム

では今度は「/Desktop/Python基礎講座/otherdirectory」の中にある「第11章その2.ipynb」から「/Desktop /Python基礎講座chapter11//」にある「MakeModule.py」を呼び出すプログラムを実行します。

【呼び出し先のファイル】

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座/chapter11/
ファイル名: MakeModule.py
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/chapter11/MakeModule.py

    #!/usr/bin/env python
    # coding: utf-8

    # In[ ]:


    def sample1():
        print('sample1')

    def sample2():
        print('sample2')

    hensu = 'test'
	

【実行ファイル】

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座/otherdirectory/
ファイル名: 第11章.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/otherdirectory/第11章その2.ipynb

    import pprint
    import sys
    sys.path.append(' ../chapter11/')
    import MakeModule as mm

    mm.sample1()
    mm.sample2()
    print(mm.hensu)
	

実行結果

	sample1
	sample2
	test
	

解説

1~3行目で「MakeModule.py」が格納されているフォルダのパス(「Desktop/Python基礎講座/chapter11/」)を指定しております。

    import pprint
    import sys
    sys.path.append(' ../chapter11/')
	

図 11.3.13 : 階層が異なるパッケージの指定

フォルダの指定を行ったので4行目で「MakeModule.py」の呼び出しを行っております。

    mm.sample1()
    mm.sample2()
    print(mm.hensu)
	

図 11.3.14 : モジュールの呼び出し


NEXT>> 11.4 本章のまとめ