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

自作のPythonパッケージをPyPIに登録してpip install可能にする

More than 1 year has passed since last update.

はじめに

自作のPythonパッケージをPyPIに登録してpip install可能にしたので、その方法をまとめました。

ちなみに参考までに自作のPythonパッケージは以下になります。
PyPIのサイト上ではどのように各種情報が表示されるのか、等の参考にしてください。

ソースコードは以下になります。

パッケージ登録の手順

パッケージ登録の流れは以下になります。

  1. テスト環境・本番環境のPyPIのアカウント登録
  2. wheel, twineのインストール
  3. setup.pyの作成
  4. python setup.py bdist_wheelの実行
  5. (任意).gitignoreの編集
  6. (任意)テスト環境のPyPIへのパッケージ登録とpip install
  7. 本番環境のPyPIへのパッケージ登録とpip install

パッケージのディレクトリ構成

以下の構成のパッケージを例に説明します。

.
├── .gitignore
├── README.md # GitHub用のパッケージ説明文
├── gokulang # パッケージ(プロジェクト)の名前
│   ├── __init__.py
│   ├── gokulang.py # メインモジュール
│   ├── romakana.py # サブモジュール
│   └── test_gokulang.py # メインモジュールのテスト
└── setup.py # PyPIへの登録に必要

手順解説

1. テスト環境・本番環境のPyPIのアカウント登録

テスト環境・本番環境のページからResisterを選択して、アカウント登録を行ってください。

アカウント登録後、それぞれメールが届きますので、メール本文のclick this link to verify your email addressをクリックしてください。

このメール認証を行わなくても各環境のPyPIのサイトにログインはできますが、パッケージを登録しようとするとエラーになってしまいますので、忘れずにメール認証しておいてください。

2. wheel, twineのインストール

  • PyPI登録用パッケージの作成ツールであるwheel
  • PyPIへのパッケージ登録実行ツールであるtwine

をインストールします。

(venv) $ pip install wheel twine 

3. setup.pyの作成

from setuptools import setup
from codecs import open
from os import path

here = path.abspath(path.dirname(__file__))

# long_description(後述)に、GitHub用のREADME.mdを指定
with open(path.join(here, 'README.md'), encoding='utf-8') as f:
    long_description = f.read()

setup(
    name='gokulang', # パッケージ名(プロジェクト名)
    packages=['gokulang'], # パッケージ内(プロジェクト内)のパッケージ名をリスト形式で指定

    version='1.0.0', # バージョン

    license='MIT', # ライセンス

    install_requires=['janome', 'pykakasi', 'semidbm', 'six'], # pip installする際に同時にインストールされるパッケージ名をリスト形式で指定

    author='shonansurvivors', # パッケージ作者の名前
    author_email='shonansurvivors@gmail.com', # パッケージ作者の連絡先メールアドレス

    url='https://github.com/shonansurvivors/yourpackage', # パッケージに関連するサイトのURL(GitHubなど)

    description='To translate Japanese sentences into Son Goku accent.', # パッケージの簡単な説明
    long_description=long_description, # PyPIに'Project description'として表示されるパッケージの説明文
    long_description_content_type='text/markdown' # long_descriptionの形式を'text/plain', 'text/x-rst', 'text/markdown'のいずれかから指定
    keywords='gokulang goku-lang', # PyPIでの検索用キーワードをスペース区切りで指定

    classifiers=[
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python :: 3.6',
    ], # パッケージ(プロジェクト)の分類。https://pypi.org/classifiers/に掲載されているものを指定可能。
)

4. python setup.py bdist_wheelの実行

以下コマンドを実行し、PyPI登録用のパッケージを作成します。

(venv) $ python setup.py bdist_wheel

コマンドを実行すると、以下# NEWと記載したディレクトリ、ファイルが作成されます。

.
├── README.md
├── build # New
│   ├── bdist.macosx-10.9-x86_64 # New
│   └── lib # New
│       └── あなたのパッケージ名 # New(自作パッケージ名)
│           ├── __init__.py # New
│           └── あなたのパッケージ内のモジュール名.py # New
├── dist # New
│   └── あなたのパッケージ名-1.0.0-py3-none-any.whl # New
├── あなたのパッケージ名
│   ├── __init__.py
│   └── あなたのパッケージ内のモジュール名.py
├── あなたのパッケージ名.egg-info # New
│   ├── PKG-INFO # New
│   ├── SOURCES.txt # New
│   ├── dependency_links.txt # New
│   ├── requires.txt # New
│   └── top_level.txt # New
└── setup.py

なお、パッケージを修正して(バージョンアップして)、PyPI登録用パッケージを再び作り直す際は、あらかじめ上記の# NEWのディレクトリ、ファイルは削除しておきましょう。

5. (任意).gitignoreの編集

gitでこのパッケージをソース管理している場合.gitignoreに以下を追記することで、python setup.py bdist_wheelで作成されるディレクトリ、ファイルをgit管理対象外にできます。

build/
dist/
あなたのパッケージ名.egg-info/

6. (任意)テスト環境のPyPIへのパッケージ登録とpip install

6.1. テスト環境のPyPIへのパッケージ登録

以下コマンドで、テスト環境のPyPIへのパッケージ登録が開始されます。

(venv) $ twine upload --repository testpypi dist/*

ユーザー名とパスワードを聞かれるのでそれぞれ入力してください。

Enter your username: (あなたのusername)
Enter your password: 

問題無ければ、以下のようにパッケージが登録されます。

Uploading distributions to https://test.pypi.org/legacy/
Uploading あなたのパッケージ名-1.0.0-py3-none-any.whl
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 11.4k/11.4k [00:02<00:00, 5.13kB/s]

https://test.pypi.org/project/あなたのパッケージ名/にブラウザでアクセスしてください。

登録したパッケージが表示されているはずです。

6.2. テスト環境のPyPIからのpip install

テスト環境のPyPIから、あなたの自作パッケージをpip installしてみましょう。

(venv) $ pip install --index-url https://test.pypi.org/simple/ あなたのパッケージ名

なお、これまで自作モジュールを開発していたのとは別のディレクトリ、別の仮想環境にて実施することをおすすめします。

6.2.1. 【トラブルその1】 テスト環境のPyPIのサイトにはパッケージが掲載されているのに、インストールができない

テスト環境のPyPIのサイトにはパッケージが掲載されているのに、インストールできない場合があります。

  Could not find a version that satisfies the requirement あなたのパッケージ名 (from versions: 1.0.5)
No matching distribution found for あなたのパッケージ名

反映に時間がかかっている可能性があります。少し待ってから、改めてインストールしてみてください。私の場合、10分〜15分程度待ったら解消した場合がありました。

6.2.2. 【トラブルその2】 テスト環境のPyPIから依存関係にあるパッケージをインストールできない

今回のサンプルパッケージでは、依存関係にあるいくつかの別パッケージをsetup.pyinstall_requiresに指定していますが、これらパッケージがテスト環境のPyPIに存在するとは限りません。

以下は、setup.pyinstall_requiresに指定していたsemidbmが、テスト環境のPyPIから見つからず、自作パッケージ自体のpip installが失敗に終わっています。

Collecting semidbm (from あなたのパッケージ名)
  Could not find a version that satisfies the requirement semidbm (from あなたのパッケージ名) (from versions: )
No matching distribution found for semidbm (from あなたのパッケージ名)

こういった場合は、その依存パッケージだけ個別に本番環境のPyPIからインストールしましょう(要は普通にpip installしましょう)。

(venv) $ pip install semidbm

6.2.3. 【トラブルその3】 テスト環境のPyPIからpip installした自作パッケージが正常に動作しない

以下の理由が考えられます。

  • setup.pyinstall_requiresに指定した依存パッケージ群のバージョンが、本番環境のPyPIと比較して最新でない為、不整合が生じている

テスト環境のPyPIが不完全であることから問題が生じているので、こうした場合は諦めて本番環境のPyPIへのパッケージ登録に進んでしまって良いと思います。

7. 本番環境のPyPIへのパッケージ登録とpip install

7.1. 本番環境のPyPIへのパッケージ登録

以下コマンドで、本番環境のPyPIへのパッケージ登録が開始されます。

(venv) $ twine upload --repository pypi dist/*

ユーザー名とパスワードを聞かれるのでそれぞれ入力してください。

Enter your username: (あなたのusername)
Enter your password: 

問題無ければ、以下のようにパッケージが登録されます。

Uploading distributions to https://pypi.org/legacy/
Uploading あなたのパッケージ名-1.0.0-py3-none-any.whl
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 11.4k/11.4k [00:02<00:00, 5.13kB/s]

https://pypi.org/project/あなたのパッケージ名/にブラウザでアクセスしてください。登録したパッケージが表示されているはずです。

7.2. 本番環境のPyPIからのpip install

改めて説明するまでもありませんが、本番環境のPyPIからのpip installは以下の通りです。

(venv) $ pip install あなたのパッケージ名

よくあるエラーとその対処方法

参考

sencorp
幼稚園・保育園向けインターネット写真サービス「はいチーズ!」を提供しています。
https://sencorp.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