我有一个面向组件的Python(3.3)项目。我有一个基础Component
课程。我希望其他人能够添加包含Component
子类的模块,只需将他们的.py
文件复制到某个文件夹中,而无需编辑任何内容。然后,运行主程序应该只导入该文件夹中找到的所有.py
个文件。从我的主程序到这些子类的所有访问都是通过Component.__subclasses__()
,而不是通过显式名称。我并不特别担心不同用户编写的模块中的代码之间的名称冲突,但我当然希望尽可能避免它,而不会搞砸简单的drop-file-into-folder包含。
如何构建一个包来实现这个目标?
答案 0 :(得分:2)
我会像这样构建包:
myPackage
+ -- __init__.py
+ -- Component.py
+ -- user_defined_packages
+ -- __init__.py # 1
+ -- example.py
思路:
user_defined_packages
中的init文件可以在导入user_defined_packages
后加载所有子包。它必须打印所有错误。 __init__.py
#1
import os
import traceback
import sys
def import_submodules():
def import_submodule(name):
module_name = __name__ + '.' + name
try:
__import__(module_name)
except:
traceback.print_exc() # no error should pass silently
else:
module = sys.modules[module_name]
globals()[name] = module # easier access
directory = os.path.dirname(__file__)
for path_name in os.listdir(directory):
path = os.path.join(directory, path_name)
if path_name.startswith('_'):
# __pycache__, __init__.py and others
continue
if os.path.isdir(path):
import_submodule(path_name)
if os.path.isfile(path):
name, extension = os.path.splitext(path_name)
if extension in ('.py', '.pyw'):
import_submodule(name)
import_submodules()