2021年5月7日金曜日

Pythonで自作パッケージをpipでインストールする

Pythonで作成したパッケージを別環境で使いたい場合はコピーすれば使えるが、いちいちコピーするのはやや面倒。作成したパッケージをpipでインストールできるようにしておくと、別環境への導入が簡単になる。もちろん、GitHubなどで公開して他人に使ってもらうときにもpipでインストールできたほうが使ってもらやすい。今回はパッケージをpipでインストールできるようにする方法をまとめる。


環境


WSL2(Ubuntu20.04)。


pipでのローカルパッケージのインストールについて

pipはPyPl(リポジトリ)からパッケージなどをインストールするときに使われ、次のようなコマンドでパッケージなどをインストールできる。 

pipではPyPlの代わりにローカルにあるモジュールもインストール可能で、必要なファイルがそろったパッケージのディレクトリで以下のコマンドを実行すると、PyPlのパッケージと同様にローカルのパッケージがインストールされる。今回はこのコマンドでインストールできるようにする。


パッケージのファイル構成

pipでインストールするにはいくつかファイルを用意する必要がある。例としてjsweetsというディレクトリを作成し、その配下に以下のような構成でファイルを作成する。

jsweetsディレクトリ配下のanmitsu.pyとdorayaki.pyがパッケージのモジュールで、setup.pyとrequirements.txtはインストールに使うファイル。

from .__version__ import __version__

from jsweets import dorayaki
from jsweets import anmitsu
VERSION = (0, 0, 1)
__version__ = '.'.join(map(str, VERSION))
import numpy as np

def anmitsu1():
    print('anmitsu1')

def anmitsu2():
    print('anmitsu2')

def anmitsu_rand():
    print('anmitsu ' + str(np.random.randint(1, 11)))
import numpy as np

def dorayaki1():
    print('dorayaki1')

def dorayaki2():
    print('dorayaki2')

def dorayaki_rand():
    print('dorayaki ' + str(np.random.randint(1, 11)))

setup.pyでインストールに必要な情報を設定する。find_packagesを使うと自動でパッケージを見つけてくれる。


ソースファル以外のパッケージに含めるファイルがある場合はpackage_dataで対象のファイルを指定し、include_package_data=Trueとしておく。バージョンの設定は文字列で指定してもいいが、__version__.pyから読み込むようにしておくと変更が1カ所で済む。パッケージに必要なライブラリなどは、requirements.txtに記述しておき、setup.pyで読み込むようにする。その他もろもろを設定しておく。
import os
from setuptools import setup, find_packages

# パッケージ名
NAME = 'jsweets'

# バージョンの読み込み
setup_dir = os.path.abspath(os.path.dirname(__file__))
ver = {}
with open(os.path.join(setup_dir, NAME, '__version__.py')) as f:
    exec(f.read(), ver)

def _requires_from_file(filename):
    return open(filename).read().splitlines()

setup(
    # パッケージ名
    name=NAME,
    # パッケージの説明
    description='Japanese sweets',
    # バージョン
    version=ver.get('__version__'),
    # インストールするパッケージ
    packages=find_packages(),
    # ソースファル以外のパッケージに含めるファイル
    package_data={NAME: ['readme.txt']},
    include_package_data=True,
    # 必要なPythonのバージョン
    python_requires='>=3.7',
    # 必要なライブラリなど
    install_requires=_requires_from_file('requirements.txt'),
)
numpy


パッケージのインストール

ファイルの準備ができたらpipでインストールしてみる。開発中にインストールを試したい場合は以下のように開発者モードでインストールすると便利。この場合、パッケージは通常pipでインストールされる場所にはインストールされず、ローカルにあるパッケージファイルが参照されるので、ローカルで加えた変更が再インストールせずに反映される。

アンインストールは以下コマンドでできる。アンインストールに失敗することがあったが、その場合はjsweets.egg-infoディレクトリを削除することでアンインストールできた。

通常のインストールは以下コマンド。

インストールしたパッケージを使ってみる。


0 件のコメント:

コメントを投稿