Pythonで自作のモジュールをパッケージ化する方法

記事内に広告が含まれています。

Pythonで自作のパッケージを作成して呼び出すにはちょっとした「おまじない」が必要です。

その「おまじない」は一見、複雑ですが、順を追って作成していけば難しいものではありません。

この記事ではパッケージ作成、Pythonへの登録、呼出、Pythonからの削除までを順を追ってみていきます。

Pythonで自作のパッケージを作成する

Pythonで自作のパッケージを作成するにはまず準備しなければならないことがあります。

今回はパッケージのフォルダー内に2つのフォルダー(viewフォルダーとmodelフォルダー)があり、それぞれがパッケージ内のモジュールとして利用できることを目指します。

まず、各フォルダー構成です。

package
├─setup.py                 パッケージ構成を宣言するファイルです。
│
├─model                    modelパッケージ用サブフォルダー
│  ├  __init__.py          modelパッケージ初期化ファイル
│  ├  modelParent.py       model親クラスファイル
│  └  modelChild.py        model子クラスファイル
│
└─view                     viewパッケージ用サブフォルダー
    ├  __init__.py         viewパッケージ初期化ファイル
    ├  viewParent.py       view親クラスファイル
    └  viewChild.py        view子クラスファイル

上記の構成でまずは「setup.py」「__init__.py」を漢字コードUTF-8で空のファイルを作成します。

setup.pyを作成する

まずsetup.pyを作成します。

中にはパッケージの名称や、バージョン、対象とするソースのあるフォルダーなどを指定します。

from setuptools import setup, find_packages

setup(
    name='mySample',    #パッケージ名
    version="0.0.1",
    description="MySmqplePackageCode",
    long_description="",
    author='mySampleAuthor',
    license='MIT',
    classifiers=[
        "Development Status :: 1 - Planning"
    ]
    ,packages=['view', 'model']   #パッケージのサブフォルダー
)

ファイルの中身で重要なのは「name」と「packages」です。

「name」はpythonに登録した時のパッケージ名、「packages」はパッケージを生成する際にソースファイルを検索するフォルダーになります。

__init__.pyファイルを作成する

次にパッケージフォルダーに__init__.pyファイルを作成します。

上記の例を2つ書いておきます。
まずはviewフォルダー内の__init__.pyファイル。

#ここでどのモジュールのどのクラスをimportするか指定する
from .viewParent import viewParent as viewParent
from .viewChild import viewChild as viewChild

#ここにこのフォルダーに定義しているクラス名を列挙する
__all__ = ['viewParent', 'viewChild']

次にはmodelフォルダー内の__init__.pyファイル。

#ここでどのモジュールのどのクラスをimportするか指定する
from .modelParent import modelParent  as modelParent
from .modelChild  import modelChild   as modelChild

#ここにこのフォルダーに定義しているクラス名を列挙する
__all__ = ['modelParent','modelChild']

ここで注意がひつようなのは「__all__」です。

この「__all__」を記述することで、実際に利用する際のimoprt文でクラス名をワイルドカード(*)で呼び出せるようになります。

各クラスファイルを作成する

あとは各クラスファイルを作成します。
今回作成する4ファイルをサンプルとして記載しておきます。

############################
#modelParent.py
############################
class modelParent:
    def myName( self ) :
        print( 'modelParent' )
############################
#modelChild.py
############################
from .modelParent import modelParent

class modelChild( modelParent ):
    def myName( self ) :
        print( 'modelChild' )
############################
#viewParent.py
############################
class viewParent:
    def myName( self ):
        print( 'viewParent' )
############################
#viewChild.py
############################
from .viewParent import viewParent

class viewChild( viewParent ):
    def myName( self ):
        print( 'viewChild' )

作成したパッケージをPythonにインストールする

ここまでくればあとはPythonで作成したパッケージが利用できるように、Pythonにパッケージを認識させます。

認識させる方法は「setup.py」のあるディレクトリに移動して

python setup.py develop

とコマンドラインから入力します。

実行すると

running develop
running egg_info
writing mySample.egg-infoPKG-INFO
writing dependency_links to mySample.egg-infodependency_links.txt
writing top-level names to mySample.egg-infotop_level.txt
reading manifest file 'mySample.egg-infoSOURCES.txt'
writing manifest file 'mySample.egg-infoSOURCES.txt'
running build_ext
Creating {Python_dir}python37libsite-packagesmySample.egg-link (link to .)
Adding mySample 0.0.1 to easy-install.pth file

Installed c:python_testpackage
Processing dependencies for mySample==0.0.1
Finished processing dependencies for mySample==0.0.1

のようなメッセージが表示されれば登録成功です。

パッケージがインストールできたか確認する

実際に自作に作成したパッケージがインストールされているかどうかを確認するには、コマンドラインから

pip list

と入力します。

すると

Package            Version Location
------------------ ------- -----------------------------
attrs              19.3.0
Babel              2.8.0
colour             0.1.5
cycler             0.10.0
et-xmlfile         1.0.1
future             0.18.2
importlib-metadata 1.4.0
         ・
         ・
         ・
mySample           0.0.1   c:python_testpackage
         ・
         ・
         ・

と自作に作成したパッケージが表示されます。

作成したパッケージを呼び出してみる

これで通常のパッケージと同様に自作パッケージが呼び出せるようになったので、呼び出してみます。

#自作にしたパッケージを呼び出す
from view   import viewParent
from view   import viewChild
from model  import modelParent
from model  import modelChild

p_model = modelParent()
p_model.myName()

c_model = modelChild()
c_model.myName()

p_view = viewParent()
p_view.myName()

c_view = viewChild()
c_view.myName()

上記の実行結果は

modelParent
modelChild
viewParent
viewChild

になり、それぞれのクラスが利用できるようになっています。

また、import文をワイルドカード「*」を使って呼び出しても

#自作にしたパッケージをワイルドカードを使って呼び出す
from view   import *
from model  import *

p_model = modelParent()
p_model.myName()

c_model = modelChild()
c_model.myName()

p_view = viewParent()
p_view.myName()

c_view = viewChild()
c_view.myName()

上記の実行結果は

modelParent
modelChild
viewParent
viewChild

になり、それぞれのクラスが利用できます。

これでサブクラスが増えるたびにimport文を追加しなくてもよくなります。

自作のパッケージをpythonからアンインストールする

一度作成したパッケージをアンインストールしたい場合はインストールと同様に「setup.py」のあるディレクトリに移動して

python setup.py develop -u

とコマンドラインから入力します。

これでアンインストールは完了です。

まとめ

Pythonでは自作に作成した複数のクラスを「パッケージ」として一つの塊として管理できます。

1つのクラスファイルがいくつものクラスを含んで巨大化したり、いくつものクラスのimport文を書かなければならなくなった場合は、クラスのパッケージ化を検討するべきです。

一度環境ができてしまえばあとは通常の編集なのでそれほど戸惑うことはありません。

以上、Pythonで自作のパッケージを作成する方法でした。

タイトルとURLをコピーしました