[英]How to iterate through a list of modules and call their methods in Python 3
Goal: Ability to drop files into "modules" folder & call a common set of methods/vars from each file. 目标:能够将文件放入“模块”文件夹,并从每个文件调用一组通用的方法/变量。
Should the modules be initialized as static classes if all of the modules have common methods/vars? 如果所有模块都具有通用方法/变量,是否应该将模块初始化为静态类?
My project folder tree: 我的项目文件夹树:
/client
__init__.py
/modules
__init__.py
foo.py
bar.py
spam.py
client __init__.py file: 客户端__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: 模块__init__.py文件:
# 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]
You may use the native python "imp" module ( https://docs.python.org/3.4/library/imp.html ): 您可以使用本机python“ imp”模块( https://docs.python.org/3.4/library/imp.html ):
Assuming the same project tree : 假设相同的项目树 :
/client
__init__.py
/modules
__init__.py
foo.py
bar.py
spam.py
client __init__.py file: 客户端__init__.py文件:
# -*- coding: utf-8 -*-
#!/usr/bin/python
import modules.__init__
#here you generate
modules.__init__.__load_all__()
modules __init__.py file: 模块__init__.py文件:
# -*- 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()
and finally 最后
modules (spam.py,bar.py, foo.py, etc...) file: 模块(spam.py,bar.py,foo.py等)文件:
# -*- coding: utf-8 -*-
#!/usr/bin/python
def __init__():
print "load"
def MyClass():
print "myclass spam,bar,foo, etc..."
When running client __init__.py
, we iterate through the modules and initialize them dynamically. 运行客户端
__init__.py
,我们遍历模块并动态初始化它们。
Best regards 最好的祝福
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.