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

Pythonのパッケージを作ってPyPIに登録する

More than 1 year has passed since last update.

Pythonのパッケージを作ってPyPIに登録する

2018年12月9日時点でPythonパッケージを配布用に登録する手順をまとめます。

作ったもの

顔文字を出力します。
コード

使い方

インストールはpipです。

> pip install py-kaomoji

kaomojiをimportして使うと、顔文字が出力されます。

from kaomoji import kaomoji
kao = kaomoji.Kaomoji()

" ランダムに顔文字を出力
kao()
> '(ヾノヾノヾノヾノヾノ・ω・`)ヾノジェットストリームナイナイ'

# 'たのしい'顔文字を出力
kao.kaomoji("たのしい")
> "たのしい!✌('ω' )三✌('ω')✌三( 'ω')"

またはコマンドラインでkaoと入力しても顔文字が出力されます。

> kao
.・ヾ(。>д<)

その他の使い方はコードをご参照ください。

まずGithubレポジトリを作る

ソースコード管理用にGithubレポジトリを作ります。
こちらからプロジェクトの設定を入力してCreate repositoryします。

image.png

.gitignoreはPython、ライセンスはMIT Licenseにします。
このあたりは忘れがちですが、この時点で設定しておくと楽です。

Pythonプログラムを作る

Githubからレポジトリをcloneしてきて、その中にプログラムを作っていきます。

> git clone git@github.com:<your acccount name>/<project name>.git

Pythonのプログラムを作ります。
ディレクトリ構成はこんな感じです。

|-- LICENSE
|-- MANIFEST.in
|-- README.md
|-- data
|   |-- __init__.py
|   |-- kaomojis.yml
|   `-- load_kaomojis.py
|-- kaomoji
|   |-- __init__.py
|   |-- __main__.py
|   `-- kaomoji.py
|-- setup.py
`-- test
    |-- __init__.py
    `-- test_kaomoji.py

data/kaomojis.ymlにyaml形式で顔文字の一覧が入っています。

あおり:
  - ( ◜◡‾)
  - (*^▽^*)
  - (⌒▽⌒)
  - o(^▽^)o
あげ:
  - ↑↑↑∩(*’ヮ’)∩↑↑↑
あせ:
  - (゚∀゚ ;)タラー
あたふた:
  - ヽ(´・ω・`ヽ)
あつい:
  - (。>﹏<)あㄘ”ゅいー

これをdictでロードして出力する、というのがプログラムの全容です。

setup.pyを作る

setup.pyを作ります。
全文は以下のような感じになっています。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""The setup script."""

import sys
from setuptools import setup, find_packages

with open('README.md', encoding='utf-8') as readme_file:
    readme = readme_file.read()


info = sys.version_info

setup(
    name='py_kaomoji',
    version='0.1.3.4',
    description='This is a Kaomoji library for Python for Japanese.',
    long_description=readme,
    long_description_content_type='text/markdown',
    author='shibuiwilliam',
    author_email='*******@gmail.com',
    url='https://github.com/shibuiwilliam/py-kaomoji',
    packages=find_packages(),
    include_package_data=True,
    keywords='kaomoji',
    classifiers=[
        'Development Status :: 2 - Pre-Alpha',
        'Natural Language :: English',
        "License :: OSI Approved :: MIT License",
        'Programming Language :: Python :: 3.6',
        "Operating System :: OS Independent",
    ],
    entry_points = {
        'console_scripts': ['kao=kaomoji.kaomoji:main'],
    },   test_suite="test",
)

基本的な書き方は公式ドキュメントのとおりですが、公式ドキュメントで説明されていない点として以下を追加しています。

  • マークダウンでREADMEを書いている。
    • Githubではマークダウンで良いが、PyPIで表示するには long_description_content_type='text/markdown が必要。
  • entry_pointでコマンド化
    • コマンドにkaoを追加するには以下を追加する必要があります。
    entry_points = {
        'console_scripts': ['kao=kaomoji.kaomoji:main'],

上記でkaoコマンドはkaomojiディレクトリのkaomoji.pyファイル内のdef main()を実行しています。

これでpython3 setup.py sdistまたはpython3 setup.py installを実効することでパッケージを作ることができますが、その前にMANIFEST.inが必要になります。

MANIFEST.in

顔文字データはすべてdata/kaomojis.ymlに入っていますが、Pythonはデフォルトでは.py以外のファイルをパッケージに含めません。
data/kaomojis.ymlをパッケージに含めるために、以下をMANIFEST.inに記述します。

recursive-include data *

配布用のパッケージにしてみる

setup.pyを使って配布可能なパッケージにするために、まずはpython setup.py checkしてみます

> python setup.py check
/opt/anaconda3/lib/python3.6/distutils/dist.py:261: UserWarning: Unknown distribution option: 'long_description_content_type'
  warnings.warn(msg)
running check

checkでsetup.pyの内容の不備を確認しています。
ひとつwarningが出ていますが、これは無視します。

続いて配布可能なパッケージを作ります。
コマンドはpython setup.py sdistです。

> python setup.py sdist
/opt/anaconda3/lib/python3.6/distutils/dist.py:261: UserWarning: Unknown distribution option: 'long_description_content_type'
  warnings.warn(msg)
running sdist
running egg_info
writing py_kaomoji.egg-info/PKG-INFO
writing dependency_links to py_kaomoji.egg-info/dependency_links.txt
writing entry points to py_kaomoji.egg-info/entry_points.txt
writing top-level names to py_kaomoji.egg-info/top_level.txt
reading manifest file 'py_kaomoji.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'py_kaomoji.egg-info/SOURCES.txt'
running check
creating py_kaomoji-0.1.3.5
creating py_kaomoji-0.1.3.5/data
creating py_kaomoji-0.1.3.5/kaomoji
creating py_kaomoji-0.1.3.5/py_kaomoji.egg-info
creating py_kaomoji-0.1.3.5/test
copying files to py_kaomoji-0.1.3.5...
copying MANIFEST.in -> py_kaomoji-0.1.3.5
copying README.md -> py_kaomoji-0.1.3.5
copying setup.py -> py_kaomoji-0.1.3.5
copying data/__init__.py -> py_kaomoji-0.1.3.5/data
copying data/kaomojis.yml -> py_kaomoji-0.1.3.5/data
copying data/load_kaomojis.py -> py_kaomoji-0.1.3.5/data
copying kaomoji/__init__.py -> py_kaomoji-0.1.3.5/kaomoji
copying kaomoji/__main__.py -> py_kaomoji-0.1.3.5/kaomoji
copying kaomoji/kaomoji.py -> py_kaomoji-0.1.3.5/kaomoji
copying py_kaomoji.egg-info/PKG-INFO -> py_kaomoji-0.1.3.5/py_kaomoji.egg-info
copying py_kaomoji.egg-info/SOURCES.txt -> py_kaomoji-0.1.3.5/py_kaomoji.egg-info
copying py_kaomoji.egg-info/dependency_links.txt -> py_kaomoji-0.1.3.5/py_kaomoji.egg-info
copying py_kaomoji.egg-info/entry_points.txt -> py_kaomoji-0.1.3.5/py_kaomoji.egg-info
copying py_kaomoji.egg-info/top_level.txt -> py_kaomoji-0.1.3.5/py_kaomoji.egg-info
copying test/__init__.py -> py_kaomoji-0.1.3.5/test
copying test/test_kaomoji.py -> py_kaomoji-0.1.3.5/test
Writing py_kaomoji-0.1.3.5/setup.cfg
Creating tar archive
removing 'py_kaomoji-0.1.3.5' (and everything under it)

カレントディレクトリにdist/py_kaomoji-0.1.3.5.tar.gzが出来上がっていれば成功です。

インストール

前項で作った配布用パッケージをインストールしてみます。
コマンドはpython setup.py installです。

> python setup.py install
/opt/anaconda3/lib/python3.6/distutils/dist.py:261: UserWarning: Unknown distribution option: 'long_description_content_type'
  warnings.warn(msg)
running install
    ...<中略>...
zip_safe flag not set; analyzing archive contents...
data.__pycache__.load_kaomojis.cpython-36: module references __file__
creating 'dist/py_kaomoji-0.1.3.5-py3.6.egg' and adding 'build/bdist.linux-x86_64/egg' to it
removing 'build/bdist.linux-x86_64/egg' (and everything under it)
Processing py_kaomoji-0.1.3.5-py3.6.egg
creating /opt/anaconda3/lib/python3.6/site-packages/py_kaomoji-0.1.3.5-py3.6.egg
Extracting py_kaomoji-0.1.3.5-py3.6.egg to /opt/anaconda3/lib/python3.6/site-packages
Removing py-kaomoji 0.1 from easy-install.pth file
Adding py-kaomoji 0.1.3.5 to easy-install.pth file
Installing kao script to /opt/anaconda3/bin

Installed /opt/anaconda3/lib/python3.6/site-packages/py_kaomoji-0.1.3.5-py3.6.egg
Processing dependencies for py-kaomoji==0.1.3.5
Finished processing dependencies for py-kaomoji==0.1.3.5

> pip list | grep py-kaomoji
py-kaomoji                         0.1.3.5  

最後にpip list | grep py-kaomojiで表示されていればOKです。

この時点ではpip install py-kaomojiでインストールすることはできません。
pip installできるようにするためにはPyPIに登録する必要があります。

PyPIに登録する

PyPIにアカウント登録

PyPIに登録するためには、まずはアカウントを作る必要があります。
PyPIからRegisterして自分のアカウントを作ります。

Webフォームで登録後、メールアドレス確認が必要です。
確認メールが届くので、認証しましょう。

PyPIにパッケージ登録

PyPIにパッケージを登録するにはtwineを使います。
twineはPyPIにパッケージ登録して配布可能にするためのユティリティツールです。
pipでインストール可能です。

> pip install twine

インストール後、パッケージのディレクトリでtwine upload dist/*を実行するだけで配布可能(pip install可能)にできます。

> twine upload  dist/* 
Enter your username: <pypi username>
Enter your password: <pypi password>
Uploading distributions to https://upload.pypi.org/legacy/
Uploading py_kaomoji-0.1.3.6.tar.gz
100%|###########################################################################################################################################################| 12.8k/12.8k [00:01<00:00, 7.25kB/s]

これで顔文字をPyPIに登録することができました。
pip install py-kaomojiできることを確認します。

> pip install py-kaomoji
Collecting py-kaomoji
  Downloading https://files.pythonhosted.org/packages/7c/8a/822776d1ce2cb9d2b0cb1484cf45d6e06d56b6f1f128d1f6d612145bd820/py_kaomoji-0.1.3.6.tar.gz
Building wheels for collected packages: py-kaomoji
  Running setup.py bdist_wheel for py-kaomoji ... done
  Stored in directory: /root/.cache/pip/wheels/98/6f/ce/bb16c5901e7b4eed76d66a3ae660064d936a277e0d129284a1
Successfully built py-kaomoji
Installing collected packages: py-kaomoji
Successfully installed py-kaomoji-0.1.3.6

最後に

(≧ω≦(。・・。)ゝギュッ ヾ(・ω・)ノシ (゚▽゚*) o(>< )( ><)oジタバタ :;(∩><∩);

Why do not you register as a user and use Qiita more conveniently?
  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
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