python の pip でインストールできる自作モジュールを作ってみる
Java にはライブラリの依存性を管理するためのつーるとしてMaven
や Gradle
がありますが、Python の世界にもパッケージ管理ツールとして pip
があります。コードの規模が大きくなってくるとモジュール化は避けては通れない課題なので、今回は pip
を使って、Python での自作モジュールの作成と呼び出しをしてみようと思います。自作モジュールを用意する
まずは作業をするための自作モジュールのディレクトリを作り、その中に移動します。ディレクトリはなんでもいいですが、わかりやすいようモジュール名と同じにしておきます。$ mkdir libhollow $ cd libhollow
このディレクトリ内に、自作モジュールのためのファイルを用意します。
ディレクトリ内に、さらにモジュール名と同じディレクトリを作成します。
$ cd libhollowそしてこのディレクトリ内部に
__init__.py
を作成します。中身は空でよいので touch
コマンドで作ります。$ touch libhollow/__init__.py同じくモジュールに含める Python のコードも入れておきます。ここでは
libhollow/jackolantern.py
というファイル名で、以下の Python コードを置いておきます。# -*- coding: utf-8 -*- def call(): print "Trick or Treet"Python コードの内容としては、"Trick or Treet" と表示される
call()
を定義しているだけです。ここまで見てくると、これが通常の Python パッケージの作りかたと同じであることに気づくかもしれません。Python に、
sys.path
上にあるパッケージを import
させるには、まずパッケージ名のディレクトリを作ってソースコードを置き、いっしょに __init__.py
もいれておく必要があります。pip でインストールできる自作モジュールを作る際にも、モジュールのコードや __init__.py
は同じようにモジュール名のディレクトリ内部に置いておくことになります。次に、
pip
がこのモジュールを認識できるよう、setup.py
という Python ファイルを作ります。中身は以下の通りです。import setuptools setuptools.setup( name="libhollow", version="1.0", author="momokan", author_email="momokan@example.com", description="libhollow is my own python package", long_description="The halloween party has gone over...", long_description_content_type="text/markdown", url="https://blog.chocolapod.net/momokan", packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 2.7.14", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] )
setup.py
には pip
にモジュールと認識させるためのメタ情報を記載します。setuptools.setup()
メソッドの引数に渡す形です。設定項目の詳細は公式ページに記載があるので、ここでは代表的な項目だけ触れておくと、
name
値はモジュール名、version
値はモジュールのバージョン番号、packages
値はモジュール内の Python パッケージ名のリスト、classifiers
値はその他の pip 向けメタデータとなります。ここでは、packages
値はハードコードせずに setuptools.find_packages()
を使って動的にリストアップして渡しています。実際にはさきほど __init__.py
を入れておいた libhollow
パッケージが設定されます。また classifiers
値には少なくとも、自作モジュールが対応している Python のバージョン、ライセンス情報、依存している OS を記載しておくべき、とのことです。ここまでで必要なファイルはすべてです。作業ディレクトリ内のファイルのレイアウトはこんな感じになっています。
$ tree . . ├── libhollow │ ├── __init__.py │ └── jackolantern.py └── setup.py公式ページのドキュメントによると、ライセンスの詳細を記載した
LICENSE
ファイルを置いたり、README.md
を書いて setup.py
の long_description
値として読み込ませたりもしていますが、この辺りはやらなくても自作モジュールは作れます。自作モジュールを Git リポジトリからインストールする
作成した自作モジュールは Python の公開リポジトリである Pypi に公開することもできます。Pypi
に公開されたモジュールは pip install
コマンドにモジュール名を渡すことで世界中の開発者が利用できるようになります。ただ今回は自作モジュールを一般公開にはせず、自分の Git リポジトリに置いておこうと思います。
pip install
コマンドは Pypi
リポジトリからだけでなく、既知の Git リポジトリからもモジュールをインストールすることができます。自作モジュールを呼びだす側のコードを用意する
先に作成した自作モジュールを呼び出す側の Python コードを用意しておきます。自作モジュールの作業ディレクトリとは別の場所に、呼び出し側のコードを置くlibuser
ディレクトリを作ります。そして中に以下の Python コードを libuser.py
という名前で置いておきます。# -*- coding: utf-8 -*- # モジュールをインストールした lib にパスを通しておく import sys sys.path.append('lib') # モジュール内の関数を import する from libhollow.jackolantern import call # モジュール内の関数を呼び出す call()
libuser
ディレクトリ内に lib
という名前で利用するモジュールを置くディレクトリを作る想定のため、置いたライブラリを参照できるよう冒頭では lib
ディレクトリを sys.path
に追加しておきます。あとは利用する自作モジュールをインポートし、呼び出すだけです。ローカルファイルシステムから自作モジュールをインストールする
今回は Git リポジトリから自作モジュールをインストールするので、自作モジュール側の作業ディレクトリを Git リポジトリにする必要があります。この辺は Git の使い方になってくるのでさらっといきます。$ git init $ git add -A $ git commit -m "1st commit"
git init
コマンドで作業ディレクトリを Git リポジトリにし、作っておいたファイルをすべてコミットします。コミット時には Author 情報なども設定しておくといいと思います。自作モジュールの呼び出し側では、
pip install
コマンドの引数に自作モジュールの Git リポジトリのパスを指定することで、自作モジュールをインストールすることができます。ここではインストールする Git リポジトリのパスを /home/momokan/python/libhollow
とします。$ pip install git+file:///home/momokan/python/libhollow -t lib Collecting git+file:///home/momokan/python/libhollow Cloning file:///home/momokan/python/libhollow to /tmp/pip-Y9f4CS-build Installing collected packages: libhollow Running setup.py install for libhollow ... done Successfully installed libhollow-1.0
-t
オプションにはインストールするモジュールの配置先ディレクトリを指定します。-t
オプションを指定しない場合はシステムのモジュール格納場所にインストールされ、他のプロジェクトからも参照できるようになります。プロジェクト毎に参照するモジュールのバージョンが違ったり、依存するモジュールを他プロジェクトと混同したくない場合などには個別のディレクトリ内に置いておくといいと思います。あとは自作モジュールの呼び出し側のコードを実行して動作確認してみます。
$ python libuser.py Trick or Treet自作モジュールの関数が呼び出せました。
BitBucket から自作モジュールをインストールする
リモートの Git リポジトリからであっても、その Git リポジトリの URL を指定すればモジュールをインストールすることができます。自作モジュールを置いておくサービスは Github でも BitBicket でもいいのですが、私は BitBucket が好きなので BitBucket に置いてみます。BitBucket は無料でプライベートリポジトリを持てるのでよいです(お世話になっているので宣伝)。BitBucket にあらかじめ空のリポジトリを作っておき、てもとにある自作モジュールの Git リポジトリを
push
しておきます。$ git remote add origin git@bitbucket.org:my-bitbucket-account-RGK239F1Z/libhollow.git $ git push -u origin masterBitBucket のアカウントはダミーとして
my-bitbucket-account-RGK239F1Z
としておきます。自作モジュールの呼び出し側で、BitBucket 上の Git リポジトリから自作モジュールをインストールします。
さきほどすでに
lib
配下に自作モジュールを置いてしまっているので先に削除しておき、$ rm -rf lib
pip install
コマンドからインストールします。$ pip install git+ssh://git@bitbucket.org/my-bitbucket-account-RGK239F1Z/libhollow.git -t lib
自作モジュールの呼び出し側のコードを実行して、リモートの Git リポジトリから再度インストールした自作モジュールの動作確認をしてみます。
$ python libuser.py Trick or Treet動いてますね。
ちなみに、
pip install
でモジュールを再インストールする際に -U
オプションをつけておくと、上書きして更新してくれます。$ pip install -U git+ssh://git@bitbucket.org/my-bitbucket-account-RGK239F1Z/libhollow.git -t libインストール済みのモジュールをインストールしようとすると以下のようなエラーがでるので、強制的に上書きしたい場合には
-U
をつけましょう。arget directory /home/momokan/python/sample/lib/libhollow-1.0-py2.7.egg-info already exists. Specify --upgrade to force replacement. Target directory /home/momokan/python/sample/lib/libhollow already exists. Specify --upgrade to force replacement.
python コメント (0) 2018/11/02 13:02:57