Python 的 import 语句需要一个“模块名称”,而不是文件路径才能工作。使用变量导入的方法是使用importlib.import_module 内置函数。
当然,您必须使用您的文件系统“路径”目录名称来打包名称,并且其中最顶部的部分必须在 PythonPath 中“可见”。 [:-3] 部分只是用来剥离 .py 部分,但您可以使用不带“.py”的模块名开始。
from importlib import import_module
module = importmodule('.'.join([path1, path2, filename[:-3]])
for attr in dir(module):
globals()[attr] = getattr(module, attr)
但是,如您所见,您将使用您不知道它们的名称来填充名称空间,因此,您不能使用这些名称来编写程序代码——这使得它变得毫无意义。使用导入模块的属性简单地创建一个新字典可能更有用:
namespace = {}
for attr in dir(module):
namespace[attr] = getattr(module, attr)
因此您可以反省导入的内容并调用/使用这些值。
现在,如果您的“path1”和“path2”不是一个包,并且您真的只想从任意位置导入模块,则需要将该位置插入 Pythonpath bedore 调用import_module .然而,Pythonpath 是一个位于 sys.path 的简单列表 - 只需在其中插入完整的文件夹路径(如果需要,稍后再弹出):
def import_path(path1, path2, module_name, namespace=None):
import sys
from importlib import import_module
from pathlib import Path # new code should use this instead of "os.path" stuff
path = Path(path1).joinpath(path2)
name = module_name[-3:] if module_name.endswith(".py") else module_name
try:
sys.path.insert(0, str(path))
module = import_module(name)
finally:
sys.path.remove(str(path))
if namespace is None:
namespace = sys._getframe().f_back.f_globals()
for name in dir(module):
namespace[name] = getattr(module, name)
(也可以直接使用__import__函数而不需要使用importlib.import_module,但文档中不建议使用它。除此之外,使用单参数形式__import__("path1.path2.module")将返回path1不是module。)