假设我有两个文件。在第一个文件中,main函数接受输入usr_input
,然后在第二个文件中调用函数myfun
。第二个文件中的函数根据usr_input
导入模块并调用其方法。 (当然导入的类具有相同的接口)
目前我将usr_input
作为参数传递并使用importlib
,如简化代码所示:
# A.py
class A:
def foo(self):
print('This is class A')
# B.py
class B:
def foo(self):
print('This is class B')
# main.py
from test_module.fun import *
if __name__ == '__main__':
usr_input = 'A' # or 'B'
myfun(usr_input)
# fun.py
import importlib
def myfun(module_name):
mn = importlib.import_module('test_module.'+module_name)
mnc = getattr(mn, module_name)
mnc().foo()
然而在函数中导入模块导致了问题并且必须更换(在调用函数之前应该导入模块,通常在文件的开头导入)。我该如何改变设计(而不是导入所有可能的类:A,B ......)?
PS:从保存的外部文件中读取模块名称不起作用,因为myfun
在其值已知之前已初始化。
答案 0 :(得分:0)
模块的动态加载:
>>> moduleNames = ['sys', 'os', 're', 'unittest']
>>> moduleNames
['sys', 'os', 're', 'unittest']
>>> modules = map(__import__, moduleNames)
Dynamic module import in Python
响应OP评论更新:
如果您不想使用内置python库来动态导入模块,那么您将无法动态导入模块,除非您想编写自己的库来复制其行为。
使用importlib发布错误/问题,或者只是静态导入您的库并通过if语句路由您的线程。
答案 1 :(得分:0)
如果您没有尝试导入完全任意的模块而只需要从列表中选择,则可以使用if-else块(或其他类似的构造)。通常这样做是为了解决Python 2.7与3.x中不同的导入。
这是在两个导入之间进行选择的简单方法:
def myfun(module_name):
if module_name == 'A':
import module_a as module
else:
import module_b as module
module.foo()