如何构建Python包,以便其他人可以轻松添加模块

时间:2014-01-29 16:05:17

标签: python module package

我有一个面向组件的Python(3.3)项目。我有一个基础Component课程。我希望其他人能够添加包含Component子类的模块,只需将他们的.py文件复制到某个文件夹中,而无需编辑任何内容。然后,运行主程序应该只导入该文件夹中找到的所有.py个文件。从我的主程序到这些子类的所有访问都是通过Component.__subclasses__(),而不是通过显式名称。我并不特别担心不同用户编写的模块中的代码之间的名称冲突,但我当然希望尽可能避免它,而不会搞砸简单的drop-file-into-folder包含。

如何构建一个包来实现这个目标?

1 个答案:

答案 0 :(得分:2)

我会像这样构建包:

myPackage
+ -- __init__.py
+ -- Component.py
+ -- user_defined_packages
     + -- __init__.py # 1
     + -- example.py

思路:

  1. 让用户放入不同的文件夹,这样他们就不会混淆您的代码和他们的代码
  2. user_defined_packages中的init文件可以在导入user_defined_packages后加载所有子包。它必须打印所有错误。
  3. __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()