gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:41 25 4
gpt4 key购买 nike

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

我如何构造一个包来实现这一点?

最佳答案

我会像这样构建包:

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

想法:

  1. 让用户进入不同的文件夹,这样他们就不会混淆你的代码和他们的代码
  2. user_defined_pa​​ckages 中的初始化文件可以在导入user_defined_pa​​ckages 后加载所有子包。它必须打印所有错误。

__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()

关于python - 如何构建 Python 包以便其他人可以轻松添加模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21436315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com