Python Tips: パッケージの開発版をインストールしたい

Python でパッケージの開発版をインストールする方法についてご紹介します。

開発版のインストールは、バグ報告やテスト等でパッケージに貢献したいときや、自分でパッケージを開発したいとき等に必要になってきます。

(尚この記事では「パッケージ」ということばは、 pip でインストールできる「ディストリビューションパッケージ」という意味で使っています)

  • Git リポジトリにあるパッケージをインストールしたい
  • ローカルにあるパッケージをインストールしたい

Git リポジトリにあるパッケージをインストールしたい

Git で管理されたパッケージをインストールしたいときは次の形で pip コマンドを使えば OK です。

$ pip install git+[リポジトリ URL]

例えば GitHub にリポジトリがある Requests の場合だと次のようになります。

$ # パターン A/B のどちらでも OK
$ # パターン A
$ pip install git+https://github.com/psf/requests.git
$ # パターン B
$ pip install git+git://github.com/requests/requests.git

バージョンやブランチを指定するには末尾に @ をつけてその後に指定します。

$ # ブランチ main
$ pip install git+https://github.com/psf/requests.git@main

$ # タグ v2.18.4
$ pip install git+https://github.com/psf/requests.git@v2.18.4

$ # コミットハッシュ 4ea09e49f7d518d365e7c6f7ff6ed9ca70d6ec2e
$ pip install git+https://github.com/psf/requests.git@4ea09e49f7d518d365e7c6f7ff6ed9ca70d6ec2e

コミットハッシュで指定する場合はハッシュ値を省略せずすべて渡す必要があるようです。

URL 等から pip がプロジェクト名(≒パッケージ名)を特定できない場合等は末尾に #egg=[プロジェクト名] を付ける必要があります。例えば、 GitHub のリポジトリの URL の末尾に .git を付けない場合は #egg=[プロジェクト名] をつけないとインストールができません。

$ # プロジェクト名を指定しない → 失敗
$ pip install -e git+https://github.com/psf/requests
Could not detect requirement name for 'git+https://github.com/psf/requests', please specify one with #egg=your_package_name

$ # プロジェクト名を指定する → 成功
$ pip install -e git+https://github.com/psf/requests#egg=requests

ちなみに pip は Git の他にも有名 VCS をひととおりサポートしており、 URL の前の git+ を他のものに変更すればその他の VCS で管理されたパッケージもインストールすることができます。

  • git+: Git
  • hg+: Mercurial
  • bzr+: Bazaar
  • svn+: Subversion

ただし各 VCS のリポジトリを利用するには対応するコマンド( githg 等)がその環境で利用できる必要があります。

参考:

ローカルにあるパッケージをインストールしたい

続いて、ローカルにあるパッケージをインストールする場合についてです。ローカルにファイル一式が置いてあるパッケージをインストールしたいときは次の形で pip コマンドを使えば OK です。

$ pip install [パッケージのパス]

ここの パッケージのパス には setup.py ファイルが含まれたディレクトリを指定します(あるいは、 sdist / wheel フォーマットのアーカイブファイルを指定する形も可能なようです)。

シンプルな hello という名前のパッケージを作ってインストールしてみた場合のイメージは次のとおりです。

$ tree hello/
hello/
├── hello.py
└── setup.py

0 directories, 2 files

$ cat hello/hello.py
def say_hello(name=None):
    msg = 'Hi, {}!'.format(name) if name else 'Hi!'
    print(msg)

$ cat hello/setup.py
import setuptools

setuptools.setup(
    name='hello',
    version='0.1',
    packages=setuptools.find_packages(),
)

$ pip install hello/
Processing ./hello
Building wheels for collected packages: hello
  Running setup.py bdist_wheel for hello ... done
  Stored in directory: [var ディレクトリのどこか]
Successfully built hello
Installing collected packages: hello
Successfully installed hello-0.1

おまけ

おまけ A: editable mode でのインストール

pip でのインストールには editable mode というモードが用意されています。これはパッケージ開発時に便利な機能で、コードが編集可能な状態でパッケージをインストールできるものです。

editable mode でインストールされたパッケージのコードに変更を加えると、再インストールをしなくてもそのまま実行環境に反映されます。

editable mode を有効にするには -e--editable )オプションを使用します。

$ pip install -e hello/

editable mode は、ローカルにファイルのあるパッケージだけでなく、通常のディストリビューションパッケージや Git リポジトリ上のパッケージの場合でも利用することができます。その際は pip install 実行時に出力されるパッケージのダウンロード先パスを確認してそこのファイルを編集すると OK です。

参考:

おまけ B: Pipenv でのインストール

Pipenv を使った場合でも上のパターンを利用することができます。

$ # Git リポジトリのパッケージを editable mode を有効にしてインストール
$ pipenv install -e git+https://github.com/psf/requests#egg=requests

$ # ローカルのパッケージをインストール
$ pipenv install hello/

$ # Pipfile には Git リポジトリや editable mode であること等がきちんと記録されている
$ cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
hello = {path = "./hello"}
requests = {editable = true, git = "https://github.com/psf/requests"}

[dev-packages]

[requires]
python_version = "3.6"

おまけ C: インストールし直す

インストールし直したいときは pip install-U--upgrade )オプションを指定すると OK です。

...

ということで、 Python パッケージの開発版をインストールする方法についてでした。このあたりはいろいろと洗練されておりすばらしいですね。

参考: