3

我有一个在 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)
4

2 回答 2

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'and替换'.\parsers\file1.py'为所需的模块名称及其源文件的正确路径。

于 2013-06-15T06:44:04.843 回答
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)
于 2013-06-15T06:46:30.453 回答