LoginSignup
2
0

More than 1 year has passed since last update.

pip installをしたときにGitのsubmoduleがインストールされない問題

Last updated at Posted at 2021-10-09

はじめに

Github上で開発をしている際に開発しているmoduleとは別のRepositoryのmoduleを利用したい場合があります.
そのようなときにsubmoduleを利用します.一方で,単純にsubmoduleを加えるだけだとpip installをした際にsubmoduleが追加されないという問題が発生します.その対処法について簡単に説明します.

問題設定

Sphere関数という関数を作成し,それをsubmoduleとして利用したいケースを想定します.
例としてsubmodule_practice_parentというrepositoryを用意しました.

submodule_practice_parent/
 ├ submodule_practice_parent/
 │  └ __init__.py
 │  └ func.py <=== これを使いたい
 ├ requirements.txt
 └ setup.py

submodule_practice_parent.func.sphereという関数が実際に利用したい関数です.

次にsubmodule_practice_childというrepositoryを用意します.この run.py の中から submodule_practice_parent.func.sphereを呼び出せるようにします.

submodule_practice_child/
 ├ submodule_practice_parent/ <== submodule
 ├ submodule_practice_child/
 │  └ __init__.py
 │  └ run.py
 ├ .gitmodules
 ├ requirements.txt
 └ setup.py

submodule_practice_parentは以下のコマンドによってsubmodule_practice_childのsubmoduleになっていると仮定します.

git submodule add https://github.com/nabenabe0928/submodule_practice_parent submodule_practice_parent

対処法

解決の手順を順番に書いていきます.
1. submodule_practice_parent の中に setup.pyがなければ作る
2. submodule_practice_childsetup() の引数である install_requires にsubmoduleを指定する
コード例は以下の通り.

import setuptools


requirements = []
with open("requirements.txt", "r") as f:
    for line in f:
        requirements.append(line.strip())

requirements.append(
    "submodule_practice_parent "
    "@ git+ssh://git@"
    "github.com/nabenabe0928/submodule_practice_parent"
    # "@v0.0.1#egg=submodule_practice_parent"  <== versionがあるなら指定する
    "#egg=submodule_practice_parent"
)

setuptools.setup(
    name="submodule_practice_child",
    version="0.0.1",
    author="nabenabe0928",
    author_email="user@gmail.com",
    url="https://github.com/nabenabe0928/submodule_practice_child",
    packages=setuptools.find_packages(),
    python_requires='>=3.8',
    platforms=['Linux'],
    install_requires=requirements,
    include_package_data=True
)

テスト

実際にうまくいくかどうか試してみます.
今回はmoduleがpublicになっていないので,Localにcloneしてからうまくいくか試します.

# テスト用の新しい環境を作成
$ conda create -n package_checker python=3.8

# pipのパスを確認 (今回は `package_checker` のpipか確認)
$ which pip
/home/user/anaconda3/envs/package_checker/bin/pip

$ git clone https://github.com/nabenabe0928/submodule_practice_child

$ cd submodule_practice_child/

# submodule_practice_child を install
$ pip install .

# 念の為,別のディレクトリに移動
$ cd <適当なディレクトリ>

$ python
>>> from submodule_practice_child.run import start 
>>> start()
55

module not foundなしにうまく実行されました.

submoduleのVersion変更

$ cd submodule_practice_parent
$ git checkout <target branch> && git pull
$ cd ~/submodule_practice_child
$ git add submodule_practice_parent
$ git commit -m "[version] Update the submodule_practice_parent to the latest"
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0