GitHub上のリポジトリを,自分のリポジトリに読み込みたい時ってありますよね.
しかし,そのフォルダ名に-(ハイフン)が入っていたりすると,上手くインポートできません.
今回は,
- GitHub上からリポジトリをサブモジュールとしてコピーする方法
- リポジトリ名に -(ハイフン)があっても,別フォルダにあるファイルからインポートする方法
の2点について解説したいと思います。
こんなニッチェな状況を解決したいのは自分だけかもしれないね…
前提条件
はじめに、
- Git,GitHubの設定が済んでいること.
- サブモジュールとして読み込みたいリポジトリ名に -(ハイフン)が入っていること.
- 自身のリポジトリでは,サブモジュールは一つのフォルダで管理したい人.
以上の3点を前提条件とすることをします.
GitHub上のリポジトリをサブモジュールとして追加
はじめに,GitHub上のリポジトリをサブモジュールとして追加する流れを説明していきます.
自分のリポジトリ構造
サブモジュールを読み込む先の,自分のリポジトリのフォルダ構造は,以下のようにします.
my_repository
├── src
│ └── main.py
└── SubModule # GitHub上や自作モジュールを管理するフォルダ
SubModuleフォルダへGitHub上のリポジトリをダウンロードしていきます.
サブモジュールとして追加
サブモジュールを追加する前に,GitHub上のリポジトリのダウンロード先としたいSubModuleフォルダへ移動しましょう.
cd ~/my_repository/SubModule
次に,サブモジュールとして追加したいリポジトリのGitHubへアクセスし,リポジトリのURLをコピーしてきましょう.
git@github.com:MegGitHub/sub-module
こんなリポジトリは一例であって存在しないので注意なっ
以下のコマンドで,MegGitHubのsub-moduleをサブモジュールとして追加します.
git submodule add git@github.com:MegGitHub/sub-module
コマンドを実行すると,sub-moduleリポジトリがコピーされ,以下のようなフォルダ構造になります.
my_repojitory
├── src
│ └── main.py # このファイル上でmodule.py内の関数を呼び出したい
├── SubModule # GitHub上や自作モジュールを管理するフォルダ
│ └──sub-module # GitHubからサブモジュールとしてコピーしたフォルダ
│ └── module.py
└── .gitmodules # submoduleの情報が記載されたファイル
.gitmodulesファイルには,サブモジュールとして追加したsub-moduleフォルダの情報が記載されています.
以上で,GitHub上のリポジトリを自分のリポジトリにサブモジュールとして追加できました!
submoduleとして追加すると、リモートリポジトリが更新されても反映されたりするらしい(正直よくわかっていない)
フォルダ名に-(ハイフン)があるモジュール内の関数の呼び出し方
次に,src/main.py
から,sub-module/module.py
内のhello()関数を呼び出す方法を説明します.
my_repojitory
├── src
│ └── main.py # このファイル上でmodule.py内のhello()関数を呼び出したい
│ SubModule
│ └──sub-module
│ └── module.py # このファイルにはhello()関数が記載されている.
└── .gitmodules
呼び出したい関数
sub-module/module.py
ファイルのコードは以下に示します.
def hello():
print('Hello World')
呼び出す際のエラー例
hello()関数を呼び出すために,src/main.py
ファイルには,通常以下のように記述したいのですが,
from SubModule.sub-module.module import hello
hello()
こちらを実行すると,以下のようなエラーが出ると思います.
SyntaxError: invalid syntax
これは,sub-module
にハイフンが入っているためです.
解決策
このエラーを解消するには,以下のようにmain.py
ファイルに記載します.
import importlib
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'SubModule/sub-module'))
module = importlib.import_module("module")
module.hello()
このように記述し,my_rrepojitoryからmain.pyを実行すると,無事Hello World
が出力されると思います!
簡単に解説すると,sys.path.append
でsubModule/sub-moduleをsys pathに追加しています.
そして,importlib
でmoduleを検索することで,moduleをインポートできます.
最後に
以上で解説を終わります!
Pythonは,フォルダ構造が複雑になるとインポートが難しいので,まずは簡潔なフォルダ構造を心がけましょう.