Pythonライブラリを作成してPyPIに登録する

Confusion Matrix(混同行列)を視覚的に描画するdalmatianというライブラリを作成してPyPIに登録しました(ソースコードはGitHubで公開)。パッケージの作成とPyPIへの登録、情報が少なくて苦労したので、必要なファイルと公開手順のメモを残しておきます。

ファイル構成

dalmatian
├── README.md
├── dalmatian
│   ├── __init__.py
│   ├── matrix.py
│   └── test.py
├── register.py
└── setup.py

dalmatian/dalmatian/matrix.pyがモジュールの実体でtest.pyがテストファイルです。必要なファイルはsetup.pyと__init__.py。register.pyやREADME.mdは任意。

setup.py

# coding: utf-8

try:
    import setuptools
    from setuptools import setup, find_packages
except ImportError:
    print("Please install setuptools.")

import os
long_description = 'Visualizing a confusion matrix with gradations'
if os.path.exists('README.txt'):
    long_description = open('README.txt').read()

setup(
    name  = 'dalmatian',
    version = '0.1.3',
    description = 'Visualizing a confusion matrix with gradations',
    long_description = long_description,
    license = 'MIT',
    author = 'Shoya Ishimaru',
    author_email = 'shoya.ishimaru@gmail.com',
    url = 'https://github.com/shoya140/dalmatian',
    keywords = 'confusion matrix',
    packages = find_packages(),
    install_requires = ['numpy', 'reportlab'],
    classifiers = [
      'Programming Language :: Python :: 2.7',
      'Intended Audience :: Science/Research',
      'License :: OSI Approved :: MIT License'
    ]
)

上から順に説明します。ライブラリのインストールにはsetuptoolsを使用するのでimport。setuptoolsがインストールされていないときは警告を出して終了します。

PyPIのWebサイトにはreStructuredTextで書いたREADMEドキュメントを表示できるところがあります。やっぱりMarkdownで書きたいので、後述するregister.pyでREADME.mdの内容を変換します。config.pyでは変換によって出力されたテキストをlong_descriptionに代入しています。Use Markdown README's in Python modules

setup()の中にはライブラリの名前・バージョン・ライセンス形態・依存ライブラリなどを記入します。classifiersはPyPIのWebサイトから適しているものを見つけて設定します。今どきのPythonのライブラリ自作からPyPIへの登録

register.py

import os
import pypandoc

f = open('README.txt','w+')
f.write(pypandoc.convert('README.md', 'rst'))
f.close()
os.system("python setup.py sdist upload")
os.remove('README.txt')

Markdownで書かれたREADME.mdをreStructuredTextに変換するスクリプトです。python setup.py sdist uploadも含めることで、python register.pyのコマンドひとつで公開までできるようにしました。

__init__.py

# coding:utf-8

from matrix import Matrix

モジュールの実体と同じ階層に__init__.pyという名前でファイルを作成します。中身は空でも良いのですが、ここでクラスを列挙してimportすることで、ライブラリを使用するときにLIBRARY_NAME.CLASS_NAMEの形でクラスを扱うことができるようになります。

.gitignore

.DS_Store
*.swp
*.swo
*.pyc
*.egg-info/
dist/

ソースコードをGitHubなどで公開する場合は、パッケージ作成にともなって作られるファイルを.gitignoreに書いておくことを忘れないようにしましょう。

公開

まずPyPI > Registerでアカウントを作成します。次に下記のコマンドを実行します。

# PyPIアカウントでログイン
$ python setup.py register

# register.pyを作成している場合
$ python register.py

# 作成していない場合
$ python setup.py sdist upload

最初のアップロードではアカウント情報を入力します(.pypircに保存される)。結果出力が200でエラーがなければライブラリの公開は完了です。

今日からあなたもpypi author!!