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」です。
__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__」です。
各クラスファイルを作成する
あとは各クラスファイルを作成します。
今回作成する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で自作のパッケージを作成する方法でした。