【问题标题】: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
    

    想法:

    1. 让用户放入不同的文件夹,这样他们就不会混淆您的代码和他们的代码
    2. 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2015-09-10
      • 2018-08-02
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多