以下のコードは、パスで指定された Python スクリプトを、その場所に関係なく、Python バージョン セーフな方法でインポートします。
def import_module_by_path(path):
name = os.path.splitext(os.path.basename(path))[0]
if sys.version_info[0] == 2:
# Python 2
import imp
return imp.load_source(name, path)
elif sys.version_info[:2] <= (3, 4):
# Python 3, version <= 3.4
from importlib.machinery import SourceFileLoader
return SourceFileLoader(name, path).load_module()
else:
# Python 3, after 3.4
import importlib.util
spec = importlib.util.spec_from_file_location(name, path)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
これは、psutilsのコードベースの1042 行目psutils.test.__init__.py
( 09.10.2020 時点での最新のコミット) で見つかりました。
使用例:
script = "/home/username/Documents/some_script.py"
some_module = import_module_by_path(script)
print(some_module.foo())
重要な警告: モジュールはトップレベルとして扱われます。その中の親パッケージからの相対インポートは失敗します。