import XX-master ができない!
以下のことをしようとした.
- GitHub からリポジトリを clone
- そのリポジトリ内部にある
.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 の実装
公式のリファレンス