如何从也存储为变量的 python 文件中调用存储为变量的函数?

How can I call a function that is stored as a variable from a python file that is also stored as a variable?

我可以使用 import_module 导入 python 脚本。但是,如何从该脚本中调用存储为变量的函数?我以前使用 getattr 来处理存储为变量的字典,但我认为这种方法不适用于函数。这是一个当前不起作用的示例:

from importlib import import_module

file_list = ['file1','file2']
func_list = ['func1','func2']

for file in file_list:
  test_file = import_module(file)
  for func in func_list:
    from test_file import func

文件 1:

def func1():
  ...

def func2():
  ...

文件 2:

def func1():
  ...

def func2():
  ...

基本上,您会 运行 将此代码放在一个单独的文件中,并在其中显示 the_file_where_this_is_needed.py 您会在您希望这些导入语句所在的位置插入文件。 (也可能您可以在文件中 运行 此代码)。它会有点像硬编码但自动

file_list = ['file1', 'file2']
func_list = ['func1', 'func2']


with open('the_file_where_this_is_needed.py', 'r') as file:
    data = file.read()

string = ''
for file in file_list:
    for func in func_list:
        string += f'from {file} import {func}\n'

data = string + data

with open('the_file_where_this_is_needed.py', 'w') as file:
    file.write(data)

I can import a python script using import_module.

执行此操作时,结果是一个 模块对象 - 与 import 语句提供的一样。

from test_file import func

这不起作用的原因是因为它正在寻找 test_file 模块 - 它关心的是出现在 sys.path 中的模块名称,而不是您的局部变量名称。

幸运的是,由于您已经有了模块对象,您可能意识到您可以正常访问内容,作为属性,例如test_file.func.

I've previously used getattr to work with dictionaries stored as variables, but I don't think this same method works with functions

我不太清楚你的意思。属性就是属性,无论它们是纯数据、函数、类 还是其他任何东西。 test_file 是具有 func 属性的事物,因此 getattr(test_file, 'func') 获得该属性。

剩下的问题是变量-变量问题——您真的不想动态地为该结果创建名称。所以是的,如果需要,您可以将其存储在字典中。但坦率地说,只使用 module 对象 更容易。除非出于某种原因你 need/want 到“trim” 内容并且只公开有限的接口(对于其他一些客户端);但你无法避免加载整个模块。 from X import Y 不管怎样

您从动态导入中获得的 module 对象已经作为命名空间工作,无论如何您都需要它,因为您正在导入多个具有重叠属性名称的模块。

tl;dr:如果你想从那个导入的模块调用一个函数,就像你正常导入模块(不是一个名称from那个模块)一样.例如,我们可以将导入的模块放在一个列表中:

modules = [import_module(f) for f in filenames]

然后通过在适当的模块对象中查找来调用适当的方法:

modules[desired_module_id].desired_func()