Help us understand the problem. What is going on with this article?

Pythonで作成したライブラリを、PyPIに公開/アップロードする

More than 3 years have passed since last update.

便利なツールを作成したら、ぜひみんなにも使ってもらいたいものです。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/*

参考

icoxfog417
All my statements are from fun fancies, not a boring story that represents a company that I belonging to.
https://github.com/icoxfog417
tis
創業40年超のSIerです。
https://www.tis.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした