Pythonで作成したライブラリを、PyPIに公開する

  • 32
    いいね
  • 0
    コメント

便利なツールを作成したら、ぜひみんなにも使ってもらいたいものです。PythonではPyPIというパッケージを登録するサイトがあり、ここに登録することでpip installなどでインストールすることができるようになります。

本文書では、その手順を紹介したいと思います。

注意: 古い方法について

・・・と思ってGoogleで検索すると、現在では推奨されない古い方法がたくさん引っかかります。以下は古い方法の代表例なので、注意をしてください。

事前準備

PyPIにパッケージを公開する前に、以下の事前準備が必要です。

  • PyPIへのアカウント登録
  • アカウント認証情報を記載した.pypircの配置(オプション)

PyPIへのアカウント登録

以下から、PyPIのアカウントを作成しましょう。

PyPI Manual user registration

アカウント認証情報を記載した.pypircの配置

アップロードするたびにユーザー名やパスワードを入力するのがめんどくさい、という場合はホームディレクトリの直下に.pypircを作成し、そこに認証情報を記載しておくことができます。

[pypi]
username = <username>
password = <password>

ただ、当然このファイルは暗号化されているわけではなく、中身が平文で晒されることになるので注意してください。

PyPIへの登録

では、PyPIへの登録を行なっていきます。解説のため、以下のような構成となっているライブラリを例にとります。

YOUR-PROJECT-FOLDER
├── CHANGES.txt (OPTIONAL)
├── LICENSE.txt
├── README
├── setup.py
└── your_package (FOLDER)
    ├── __init__.py
    ├── ...
    └── subpackage (FOLDER)
        ├── __init__.py

setup.pyの用意

この構成の中で重要な役割を担うのが、ライブラリのパッケージ化処理を記述するsetup.pyです。中身は以下のような形になります。

setup.py
from setuptools import setup


requires = ["requests>=2.14.2"]


setup(
    name='your_package',
    version='0.1',
    description='Awesome library',
    url='https://github.com/whatever/whatever',
    author='yourname',
    author_email='your@address.com',
    license='MIT',
    keywords='sample setuptools development',
    packages=[
        "your_package",
        "your_package.subpackage",
    ],
    install_requires=requires,
    classifiers=[
        'Programming Language :: Python :: 3.6',
    ],
)
  • name: パッケージの名前です。実際のパッケージフォルダ名と合わせましょう
  • version: パッケージのバージョンです。アップデートするときは、ここを変更する必要があります。
  • packages: インストール対象となるパッケージを指定します。サブパッケージがある場合は、それを指定する必要がある点に注意してください。このパッケージは全部なんだよ!という場合はfind_packagesを使うと良いです
  • install_requires: パッケージが依存するライブラリがあれば記載します。記法はpip freezeで得られる形式と同一です
  • classifiers/keywords: パッケージを検索するときのタグやキーワードを記載できます。classifiersの一覧はこちらです

なお、download_urlにGitHubのアーカイブリンクを載せる例が多数ありますが、GitHub側からダウンロードしてほしいという要望がない限り不要です(そもそも、uploadするなら不要なはず)。多くのライブラリのsetup.pyにもdownload_urlの記載はありません。

実際にはもっといろいろなことを行うことができますが、基本的には上記が満たされていれば大丈夫です。詳細は公式のサンプルプロジェクトがあるため、そちらを参照すると良いと思います。

pypa/sampleproject

また、有名ライブラリのsetup.pyを見てみるのも良いでしょう。
このsetup.pyがあれば、ライブラリのパッケージ化が行えます。

ライブラリのパッケージング

setup.pyが作成できたら、以下のコマンドでパッケージ化を行うことができます。

python setup.py sdist

sdistとは"source distribution”の意味で、その名の通りソースコードベースの配布になります。そのためpip installを行う際にはユーザー側でsetup.pyの記載に基づいたビルド処理が実行されます。

このビルド処理がOSによって異なる、Python2と3で・・・とかいろいろ問題をはらむ場合、ビルド済みのパッケージを配布することも可能です。それに利用されるのが、wheelになります。このwheelの登場により、Windowsでエラーが出たみたいなことがだいぶなくなりました。

wheelを利用するには、まずwheelをインストールします。

pip install wheel

wheelをインストールするとbdist_wheelのオプションが使えるようになるので、それでパッケージングを行います。

python setup.py bdist_wheel

wheelの使い方も深いためここでは深く触れませんが、多様なプラットフォームで安全なインストールを提供したい場合は、wheel形式を検討すると良いと思います。

ライブラリのアップロード

では、いよいよアップロードを行います。まず、事前にアップロードに必要なtwineをインストールしておきます。

pip install twine

あとは、パッケージングしたフォルダをアップロードするだけです。

twine upload dist/*

参考