python和子目录的动态导入

时间:2013-06-15 06:20:54

标签: python python-2.7

我在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)

2 个答案:

答案 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)
相关问题