如何迭代模块列表并在Python 3中调用它们的方法

时间:2015-06-02 18:59:01

标签: python python-3.x module

目标:能够将文件放入“模块”文件夹&从每个文件中调用一组通用的方法/变量。

如果所有模块都有共同的方法/变量,模块是否应该初始化为静态类?

我的项目文件夹树:

/client
    __init__.py

    /modules
        __init__.py
        foo.py
        bar.py
        spam.py

客户端__init__.py文件:

from client.modules import __all__ as moduleStrings

(get list of "modules" from "moduleStrings") # How do I write this function?

# Initialize modules dynamically
for module in modules:
    if (hasattr(module, 'init')):
        print(module.__name__)
        print("Has an initialize method!")
        module.init()

# Call the do_stuff method in each module
for module in modules:
    if (hasattr(module, 'do_stuff')):
        print("Has a do_stuff method!")
        module.do_stuff()

modules __init__.py file:

# Stores a list of module string names in __all__
import os
import glob
files = glob.glob(os.path.dirname(__file__)+"/*.py")
__all__ = [ os.path.basename(f)[:-3] for f in files if "__init__" not in f]

1 个答案:

答案 0 :(得分:2)

你可以使用原生的python" imp"模块(https://docs.python.org/3.4/library/imp.html):

假设同一个项目树

/client
__init__.py

/modules
    __init__.py
    foo.py
    bar.py
    spam.py

客户端__init__.py文件:

# -*- coding: utf-8 -*-
#!/usr/bin/python

import modules.__init__
#here you generate
modules.__init__.__load_all__()

modules __init__.py file:

# -*- coding: utf-8 -*-
#!/usr/bin/python

import imp,os

def __load_all__(dir="modules"):
    list_modules=os.listdir(dir)
    list_modules.remove('__init__.py')
    for module_name in list_modules:
        if module_name.split('.')[-1]=='py':
            print "Load module ' ",module_name,"' :"
            foo = imp.load_source('module', dir+os.sep+module_name)
            foo.MyClass()

最后

模块(spam.py,bar.py,foo.py等)文件:

# -*- coding: utf-8 -*-
#!/usr/bin/python

def __init__():
    print "load"

def MyClass():
    print "myclass spam,bar,foo, etc..."

运行客户端__init__.py时,我们遍历模块并动态初始化它们。

祝你好运