GitHub のリポジトリを requirements.txt に含める
Posted: , Modified: Python GitHub PyPI pip Qiita
本稿は Qiita 投稿記事 のバックアップです.
概要
PyPI には登録されていないが,GitHub では公開されているライブラリを依存関係に含める方法.
また,setup.py から requirements.txt を参照している場合の対応方法について忘備録としてまとめる.
requirements.txt
GitHub リポジトリの URL が https://github.com/rgmining/common の場合, requirements.txt には,
-e git+https://github.com/rgmining/common.git#egg=rgmining_common-0.9.0
のように書く.#egg= 以降は <パッケージ名>-<バージョン> という書式にするようだ.
また,pip-tools を使って requirements.txt を生成している場合,
requirements.in には上記と同じ文字列を記入する.
setup.py
今まで,setup.py では下記のようにrequirements.txtの内容をinstall_requiresに渡していた.
from setuptools import setup, find_packages
def load_requires_from_file(filepath):
    with open(filepath) as fp:
        return [pkg_name.strip() for pkg_name in fp.readlines()]
setup(
    # その他の項目は省略
    install_requires=load_requires_from_file("requirements.txt")
)
requirements.txtにURLが含まれている場合は,もう少し改良してパッケージ名だけをリストアップする.
def take_package_name(name):
    if name.startswith("-e"):
        return name[name.find("=")+1:name.rfind("-")]
    else:
        return name.strip()
def load_requires_from_file(filepath):
    with open(filepath) as fp:
        return [take_package_name(pkg_name) for pkg_name in fp.readlines()]
また,URL部分はsetup関数のキーワード引数dependency_linkに渡す.
def load_links_from_file(filepath):
    res = []
    with open(filepath) as fp:
        for pkg_name in fp.readlines():
            if pkg_name.startswith("-e"):
                res.append(pkg_name.split(" ")[1])
    return res
setup(
    # 他の項目は省略
    install_requires=load_requires_from_file("requirements.txt"),
    dependency_links=load_links_from_file("requirements.txt"),
)
以上で,python setup.py testなどとすると,GitHubからパッケージを用意してテストを実行できる.
参考
