RSS2.0

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 master
BitBucket のアカウントはダミーとして 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


公開範囲:
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2018, 11>>
28293031123
45678910
11121314151617
18192021222324
2526272829301