在运行时导入任意模块

时间:2015-12-28 14:11:17

标签: python import

我已经阅读了这个答案:How to import a module given the full path?我仍然不确定解决问题的最佳方法是什么,我想看看社区有什么要说的。我通过实例学得最好,对不起,如果我在这里厚!

我有一个充满任意目录和文件的目录树,我抓取它来查找目录作为类别,然后里面的.py文件都是一个模块。我没有问题爬行目录树并找到文件,问题是正确导入它们并在以后使用它们。我正在使用Python 3.4。

我应该提一下,我可以控制我要导入的每个文件,并且可以指定在导入时可用于解析的格式或名称。 编辑示例用例如下:> use /parsers/foo然后加载模块,然后发出parsers/foo > set filename bar.xml然后发出parsers/foo > run命令和数据被解析并保存到数据库中。

我想我的问题是:

  • 您将如何设置此导入循环
  • 以后如何使用它们

这是我使用prompt_toolkit构建的CLI界面。我们的想法是发布像“使用类别/模块”这样的命令,比如Metasploit或其他类似的接口。

这是目录/模块抓取代码: def _load_modules(self, mod_path): self.modules = {} # walk through the module tree for dirpath, subdirs, filenames in os.walk(mod_path): if len(filenames) > 0: for filename in [f for f in filenames if f.endswith('.py')]: # extract the category from the module directory cat = (re.search('/modules/([^/]*)', dirpath).group(1)) self.modules.setdefault(cat,list()).append( (dirpath, filename) ) 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

你没有提到你的CLI界面是如何工作的,所以我假设你做了最简单的事情而且只是eval - 无论用户给你什么。我不赞同这种做法,但奥卡姆的剃刀等等。

  

我只是想看看有人如何管理导入一堆模块......

module_names = ["math", "string", "collections"]
modules = {}
for name in module_names:
    modules[name] = __import__(name)
  

...然后可能是一个稍后如何调用它的代码示例。

command = "collections.Counter(string.uppercase)"
result = eval(command, modules)
print "The result of your command is", repr(result)