首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python 3中迭代模块列表并调用它们的方法

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

Stack Overflow用户
提问于 2015-06-02 18:59:00
回答 1查看 6K关注 0票数 4

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

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

我的项目文件夹树:

代码语言:javascript
运行
复制
/client
    __init__.py

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

客户端__init__.py文件:

代码语言:javascript
运行
复制
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()

模块__init__.py文件:

代码语言:javascript
运行
复制
# 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]
EN

回答 1

Stack Overflow用户

发布于 2015-06-02 20:13:48

您可以使用本机python "imp“模块(https://docs.python.org/3.4/library/imp.html):

假设相同的项目树

代码语言:javascript
运行
复制
/client
__init__.py

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

客户端init.py文件:

代码语言:javascript
运行
复制
# -*- coding: utf-8 -*-
#!/usr/bin/python

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

模块init.py文件:

代码语言:javascript
运行
复制
# -*- 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等)文件:

代码语言:javascript
运行
复制
# -*- coding: utf-8 -*-
#!/usr/bin/python

def __init__():
    print "load"

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30604401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档