ハイフンが入ったGitHubリポジトリを別フォルダからインポートする方法

GitHub上のリポジトリを,自分のリポジトリに読み込みたい時ってありますよね.

しかし,そのフォルダ名に-(ハイフン)が入っていたりすると,上手くインポートできません.

今回は,

  1. GitHub上からリポジトリをサブモジュールとしてコピーする方法
  2. リポジトリ名に -(ハイフン)があっても,別フォルダにあるファイルからインポートする方法

の2点について解説したいと思います。

Meg
Meg

こんなニッチェな状況を解決したいのは自分だけかもしれないね…

前提条件

はじめに、

  • 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
Meg
Meg

こんなリポジトリは一例であって存在しないので注意なっ

以下のコマンドで,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上のリポジトリを自分のリポジトリにサブモジュールとして追加できました!

Meg
Meg

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は,フォルダ構造が複雑になるとインポートが難しいので,まずは簡潔なフォルダ構造を心がけましょう.

参考文献

Git - Book
のさまざまなツール-サブモジュール
pythonでハイフンのつくファイルをモジュールとして読み込む方法 - blog.ton-up.net
pythonはファイル名にハイフンをつけることは推奨していない. というかハイフンがあるファイルをモジュールとしてimportしようとするとシンタックスエラーになる. しかし,や …
Pythonの相対インポートで上位ディレクトリ・サブディレクトリを指定 | note.nkmk.me
パッケージを自作する場合、パッケージ内のモジュールから上位ディレクトリ(親ディレクトリ)や下位ディレクトリ(サブディレクトリ)にあるほかのモジュール(ファイル)をインポートしたいことがある。そのようなときは、相対パスで相対的な位置を指定してインポート(相対インポート)することができる。6. モジュール ...
タイトルとURLをコピーしました