我在python 2.7中有一个如下所示的数据结构
myfile.py
--parsers
--folder1
file1.py
def filemethod(data=None)
pass
在文件夹解析器下,我可以添加许多子文件夹
我将永远知道我想要调用的函数的名称
如何导入解析器目录,以便在每个子目录中找到方法,并可从myfile.py访问。我使用getattr将名称转换为函数对象。这是必要的,因为我得到了从远程调用到redis队列调用的函数的名称。
import ??????
methodToCall = getattr('filemethod', 'file1')
methodToCall(data)
答案 0 :(得分:4)
进行动态导入的好方法是使用imp.load_source()
:
import imp
module = imp.load_source( 'mymodule', module_full_path )
在你的情况下,它将是:
module = imp.load_source( 'file1', '.\parsers\file1.py')
methodToCall = getattr( module, 'filemethod' )
methodToCall( data )
确保将'file1'
和'.\parsers\file1.py'
替换为所需的模块名称及其源文件的正确路径。
答案 1 :(得分:0)
另一种方法是首先从parsers/__init__.py
导入子目录。
parsers/__init__.py
:
import folder1
import folder2
...
然后:
import parsers
foldername = 'folder1' # for example
mod = getattr(parsers, foldername)
methodToCall = getattr(mod, 'filemethod')
methodToCall(data)