This page looks best with JavaScript enabled

python での動的な import とハイフンとの格闘

 ·   ·  ☕ 2 min read  ·  🐶 odanny · 👀... views

import XX-master ができない!

以下のことをしようとした.

  1. GitHub からリポジトリを clone
  2. そのリポジトリ内部にある.pyファイルを import して使う

こんなことがしたのは, clone したファイルを git 管理に含みたくなかったからだ.これから更新されていっても,動的にcloneして使用できるようにしたかった.

コマンド実行だけの1は問題ではなかったが,2をしようとして詰まった.

2021/01/11追記:1.は Git submodule を使うとよさそうです

1
from XXX-master import py_file

とすると,syntax error が出た.

python ではファイル名にハイフンをつけるのはよくないらしい.(masterはどうしようもないやん!)

解決策

importlibを使用する.

1
2
3
4
5
import importlib
module_name = importlib.import_module("py_file", "XXX-master")

# 普通に使える
module_name.function_1()

なお import 可能かどうか調べるには

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import importlib.util
import sys

# For illustrative purposes.
name = 'itertools'

if name in sys.modules:
    print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
    # If you chose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"{name!r} has been imported")
else:
    print(f"can't find the {name!r} module")

のように,importlib.util.find_spec()を使う.(公式リファレンスはpython3.8 で導入されたばかりのセイウチ演算子(:=)を使用していてモダン!!)

初めて使う標準ライブラリはおもしろい.

参考

pythonでハイフンのつくファイルをモジュールとして読み込む方法
2013の記事だが,2019/12月現在も同じ内容.

importlib — import の実装
公式のリファレンス

Share on

odanny
WRITTEN BY
odanny
レトロゲームが好きな大学院生