Pythonのパッケージを作ってPyPIにリリースする方法まとめ

PyPIって?

Pythonを使っている人にはお馴染みですが、まず、PyPIとはPython Package Indexの略で、Pythonのパッケージ置き場となっていて、2021年の10月の現時点で約300万件のパッケージが置かれています。

では、なぜ今回、ここにパッケージを置きたいのかというと、Python自体の開発を行っているPython Software Foundationという組織が管理しているおかげ?で、pip installからデータを簡単に取ることが出来るからです。

もちろん、自分のgithubなどに置いてpip install git+https://github.com/frgmt/packageなどということも出来ますが、PyPIに置くことで、パッケージ名だけでインストール出来るようになり、より多くの人にも使ってもらえるようになるのではないかと思います。

パッケージを作るのに必要なファイル

PyPIにパッケージとしてリリースするには、最低限以下のファイルが必要になります。

package名/
  packageの中身/
    __init__.py
    main.py
  setup.py
  LICENSE
  README.md

非常にシンプルですね。

ただし、実際には他にもユニットテストを乗せたりとか、パッケージ内で使用するパッケージを読み込む為のファイルを用意したりと、いくつかファイルは増えました。

また、こちらの本家のドキュメントを参考にすると良いと思います。

具体的な作成方法

setup.pyを用意する

まずはパッケージを吐き出す際に、一番の肝となるsetup.pyというファイルを用意します。

from setuptools import setup

setup(
    name='package名',
    description=(
        '概要',
    ),
    long_description=open('README.md').read(),
    long_description_content_type='text/markdown',
    url='http://github.com/frgmt/',
    license='MIT',
    author='fragment.co.jp',
    author_email='[email protected]',
    packages=['packageの中身'],
    version='0.0.1',
    install_requires=[
        'Django>=2.2',
        'cryptography>=35.0.0',
    ],
)

上記のファイル構成で示したpackage名やpackageの中身のディレクトリ名を入れ込みます。

あとは、大体見ての通りなのですが、long_descriptionを入れておくと良いと思います。ここに入れておかないとPyPIのproject descriptionに何も表示されません。

また、long_descriptionでmarkdown方式のファイルを指定した場合は、long_description_content_typetext/markdownを指定しましょう。

packageの中身を用意する

まずは、packageの中身となるディレクトリを用意します。その中に、__init__.pyと自分の好きなメインファイル(今回の場合、main.py)を用意しましょう。

main.pyには実際に使用出来るクラスや関数を用意してあげれば良いだけですので、ここでは省略します。

個人的には、__init__.pyでmain.pyのクラスや関数をインポートしといてあげると、後々親切かなと思いました。

LICENSEやREADME.mdを用意する

LICENSEREADME.mdファイルも、とても大切なファイルです。実際に使う人が、どのようなライセンス形式で使うことが出来るのか、どのような方法で使用出来るのか、ちゃんと明記しておきましょう。

MITのライセンスの書き方などは、パッケージ作成のドキュメントにも記載されていますので、こちらを使用しても良いかもしれません。

パッケージ化する

ここまで出来たら、実際にパッケージ化をしていきます。

まずは、パッケージ化に必要なwheelをインストールします。

pip install wheel

続いて、wheelを使用して、ソースコードの配布物とパッケージの作成をします。

python setup.py sdist bdist_wheel

上記で作成したsetup.pyを使用し、こちらのコマンドを打つことで、build・dist・パッケージ名.egg-infoというフォルダが作成され、その中に実際に使用出来るパッケージが出力されます。

PyPIにアップロードする

ここまで出来たらあと一息です。実際にPyPIにアップロードする作業に入りましょう。

アカウント作成

まずは、PyPIに登録しましょう。ここで注意が必要なのですが、PyPIには本番用とテスト用のレポジトリがあり、それぞれでアカウントが必要だということです。念の為、テスト用もアカウントを作っておいた方がいいかと思います。

アップロード

まずは、アップロードに必要なtwineをインストールします。

pip install twine

twineを使って、このパッケージがちゃんと壊れていないで、ちゃんとアップロード出来るのか確認することが出来ますので、本番用のレポジトリに上げる前には、以下のコマンドでチェックしてみると良いかもしれません。

twine check dist/パッケージ名.tar.gz

twineを使って、実際にアップロードします。

twine upload --repository pypi dist/*

テスト用のレポジトリにアップロードする際には、pypiの部分が、testpypiになります。

また、プロンプト上で、IDとパスワードを求められますので、アカウント作成時に使用したIDとパスワードを入力すると、アップロードされます。

アップロードされたファイルを確認

アップロードすると、https://pypi.org/project/<パッケージ名>/にアップロードされます。

実際にアクセスして、アップロードしているか確認してみましょう。

また、実際にインストールがちゃんと出来るのかも確認しておくと良いかもしれません。

pip --no-cache-dir install --upgrade <パッケージ名>

実際に作ったパッケージ

今回、実際に作ったパッケージは、以下のDjangoで暗号化・復号化するフィールドを扱うことの出来るパッケージになります。何かの参考になるかもしれませんので、コードも見て頂けると幸いです。

まとめ

Flutterの時もそうですが、自分が使いたいものをパッケージ化しておいて、他の人に使ってもらえることは嬉しいものです。

また、非常に勉強にもなりますし、何かアイデアがあれば、あなたもパッケージを作ってみてはいかがでしょうか?

コメントを残す