【问题标题】:How to structure a Python package so others can add modules easily如何构建 Python 包以便其他人可以轻松添加模块
【发布时间】:2014-02-21 13:33:34
【问题描述】:
我有一个面向组件的 Python (3.3) 项目。我有一个基础Component 类。我希望其他人能够添加包含Component 子类的模块,只需将他们的.py 文件复制到某个文件夹中,而无需编辑任何内容。运行主程序然后应该简单地导入在该文件夹中找到的所有.py 文件。从我的主程序到这些子类的所有访问都是通过Component.__subclasses__(),而不是通过显式名称。我并不特别担心不同用户编写的模块中的代码之间的名称冲突,但我当然希望尽可能避免这种情况,而不会搞砸简单的将文件放入文件夹的包含。
我如何构建一个包来实现这一点?
【问题讨论】:
标签:
python
module
package
【解决方案1】:
我会像这样构建包:
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()