📚

Pythonで自分だけのクソライブラリを作る方法

5 min read

Pythonでライブラリを作る

この記事は、Pythonの基礎とpipでライブラリをインストールしたことあるくらいのレベルの人を想定しています。初心者向けの記事です。

前提知識として、Pythonのライブラリ・パッケージ・モジュール・クラス・関数の定義や違いに関しては、以下記事あたりを参考にしてください。

https://ai-inter1.com/python-module_package_library/

この記事では、Pythonで自作ライブラリを作ります。pip install hogehogeでインストールできるあれですね。

初心者の方(何を隠そう私も初心者です)だとpip installでインストールできるライブラリって、GoogleとかFacebookのような選ばれたエリート組織だけが作れるものと思っていませんか?私もつい最近までそう思っていました。実はあれ、個人でも簡単に作れてしまいます。

pip install hogehogeで、世界中の誰でもインストールできるライブラリを作れてしまうのです。興奮してきませんか?興奮したあなたは立派な変態Pythonistaです。というわけで、自作ライブラリを作る旅に出ましょう!

ずばり目標はpip install unkoでインストールできるクソライブラリを作ることです。

使い方は、以下のような感じです。

>>> import unko
>>> unko.deru()
puripuri

クサそうですね。Let's Puripuri!

自作ライブラリを作るメリット

一応ここで、自作ライブラリを作るメリットを改めて書いておきます。

1つは当然、先程書いたように世界中の人に使ってもらえるという点ですね。TensorFlow, Scikit-learnのようなライブラリと同じように、世界中の人が自分のライブラリをpipでインストールできるのです。ワクワクしますよね。

もう一つは、ライブラリ化しておくと、どこからでも使うことができる点です。Pythonはpipでインストールしなくても、hogehoge.pyというファイルを直接指定してimportできるのですが、ファイルの場所によっては地味に面倒だったりします。特に、importしたいファイルが、上の階層にある場合ですね。

解決方法は、調べれば色々出てくるのですが、いっそライブラリ化しちゃえばpip installすることで、どこでも使えて便利ですね!

自作ライブラリのファイル構成

ファイルの構成は以下のようになります。

unko
├── setup.py
└── unko
    ├── __init__.py
    └── unko.py

シンプルかつクサそうですね。

メインとなるunko.pyの中身をみてみます。

def deru():
    print('puripuri')

deru()という関数を呼ぶとpuripuriと表示されます。理由とか意味は聞かないでくださいね(私にも分かりません)。

setup.pyの中身は以下です。これによりpipでインストールできるようになります。

from setuptools import setup, find_packages

setup(
    name='unko',
    version='0.1',
    packages=find_packages()
)

setup.pyには、これ以外にも必要な(依存する)ライブラリ等、たくさんのオプションがあるのですが、今回は必要最小限にしています。

__init__.pyは以下とします。

from unko.unko import *

実は、このファイルはなくても良いのですが、このファイルが無いとライブラリを使うときimport unkoでなくfrom unko import unkoとする必要があり、スマートじゃなくなるのでファイルを作成しています。

__init__.pyに関しては、詳細この記事では触れませんが、手っ取り早くは以下記事参考にしてみてください。

https://qiita.com/FN_Programming/items/2dcabc93365a62397afe

ローカルでの自作ライブラリのインストール

通常のインストール

いよいよ自作のクソライブラリをインストールしてみましょう。まずはローカル環境です。unkoディレクトリ直下(setup.pyと同じ階層)で、以下コマンドを実行します。

$ pip install .

以下のように表示されたらインストールは成功です(環境によって多少表示は異なるかもしれません)。

Successfully built unko
Installing collected packages: unko
Successfully installed unko-0.1

震える手で実行してみましょう。

>>> import unko
>>> unko.deru()

puripuriと出たら、自分だけのクソライブラリ誕生です。おめでとうございます!

アンインストールする場合は以下コマンドです。

$ pip uninstall unko

開発(editable)モードでのインストール

pip installで自作ライブラリをインストールするとき、たまに以下のように-eオプションをつけている例をみかけます。

$ pip install -e .

これはeditableモードと呼ばれるものです。何が違うかというと、ライブラリを更新すると、いちいちpip installし直さなくても、その内容が即座に反映されます。

例えば、pip install -e .をした後、unko.pyを以下のようにprint('puripuri')からprint('buriburi')に変更します。

def deru():
    print('buriburi')

すると、以下コマンド実行するとburiburiと表示されます。

>>> import unko
>>> unko.deru()

変更のたびにpip installしなくて良いので、開発中はとても便利ですね。editableモードは、他にも普通のpip installと違いがあるので、公開するライブラリをつくる際には、pip installで動作を確認してから、GitHub等にアップロードした方が良いです。

最初、setup.pypackagesの設定をしていなくてハマったりしました。

自作ライブラリをGitHubからインストール

これでローカルでクソライブラリができましたが、これだと外で急にクソライブラリが必要になったとき困ってしまいますね。

そんなときは、GitHubのリポジトリにクソライブラリをアップロードしておきましょう。実際に用意したリポジトリが以下です。

https://github.com/karaage0703/unko

ファイル構成は、先程のものと全く同じです。クサそうですね。

pipは、実はpip install git+<リポジトリのURL>でGitHub上のリポジトリのライブラリをインストールできます。

なので、以下コマンド実行すれば、ネットに繋がっていれば誰でもどこでもクソライブラリをインストールすることができます。

$ pip install git+https://github.com/karaage0703/unko

PyPIに登録

ここまでくれば目標のpip install unkoでインストールできるクソライブラリを世界中に公開するまであと一歩です。

pip install <package name>でインストールできるようにするには、PyPI(Python Package Index)に登録する必要があります。ただ、私はPyPIでクソライブラリを公開はできませんでした(迷惑かかりそうなので…)

以下記事を参考に登録すればPyPIに登録できます。 …はずです。いつか、もっと役に立つライブラリを作って登録します。

https://blog.amedama.jp/entry/2017/12/31/175036

PyPIへの作業は、少し手間なので自動化できると便利ですね。以下はGitHub Actionsを使用した例です。

https://aru47.hatenablog.com/entry/2020/11/08/162525

自動化までは不要な人は、以下のようなスクリプトをつくると便利かもしれませんね。

https://github.com/AtsushiSakai/PyRoombaAdapter/blob/master/bump_version.sh

まとめ

Pythonで自作クソライブラリをつくる方法をまとめてみました。思ったよりPythonのライブラリ手軽に作れて便利ですね。

少し大きめなプロジェクトの開発でPythonを使っているときは、ライブラリを外に公開しなくても、editableモードなど使うと楽になるケースがあるかもしれませんね。

あとは、PyPIに登録まではしなくても、よく使う個人的なライブラリは、GitHubにアップしてインストールできるようにしておくと便利かもしれませんね。

関連記事

https://karaage.hatenadiary.jp/entry/2017/12/27/073000

参考リンク

https://packaging.python.org

https://buildersbox.corp-sansan.com/entry/2019/07/11/110000

https://speakerdeck.com/nyk510/pythondeqi-qing-nipatukeziwozuo-rufalsehaliang-itoiuhua

https://teratail.com/questions/239657

https://codehero.jp/python/35064426/when-would-the-e-editable-option-be-useful-with-pip-install

https://blog.hgrs.me/20190520094349

https://qiita.com/Tadahiro_Yamamura/items/2cbcd272a96bb3761cc8

https://qiita.com/FN_Programming/items/2dcabc93365a62397afe

https://qiita.com/shonansurvivors/items/0fbcbfde129f2d26301c#71-本番環境のpypiへのパッケージ登録

参考リポジトリ

https://github.com/AtsushiSakai/PyRoombaAdapter

https://github.com/rochacbruno/python-project-template

Discussion

ログインするとコメントできます