# Python Module Bank - SQLite 模块打包系统 一个将Python模块打包到SQLite数据库,并支持从数据库直接导入模块的工具系统。 ## 🌟 特性 - **单文件分发** - 将所有模块打包到单个SQLite数据库文件 - **源代码保护** - 模块以编译后的字节码形式存储 - **动态导入** - 运行时直接从数据库加载模块,无需文件系统 - **完整包支持** - 支持包结构和子模块导入 - **CLI工具** - 提供完整的命令行接口 - **导入钩子** - 无缝集成Python导入系统 ## 📦 安装 ### 从源码安装 ```bash git clone http://124.71.68.6:3000/chakcy/module_bank.git cd module-bank pip install -e . ``` ### 依赖要求 - Python 3.7+ - 无需额外依赖(仅使用标准库) ## 🚀 快速开始 ### 1. 创建示例模块 ```python # my_module.py def hello(): print("Hello from my_module!") return "success" ``` ### 2. 打包模块到数据库 ```python # pack_example.py from module_bank import PythonToSQLite packer = PythonToSQLite("my_modules.db") packer.pack_module("my_module.py", "my_module") packer.pack_directory("my_package/") ``` ### 3. 从数据库导入 ```python from module_bank import PythonToSQLite # 安装导入器 packer = PythonToSQLite("my_modules.db") finder = packer.install_importer() # 现在可以从数据库导入模块了! import my_module import my_package.package_module my_module.hello() my_package.package_module.hello() ``` ## 📖 详细使用 ### 命令行工具 ```python # 打包模块或目录 mb pack my_package --db modules.db # 列出数据库中的模块 mb list --db modules.db # 安装导入器并进入交互模式 mb install --db modules.db ``` ### 编程接口 #### 打包模块 ```python from module_bank import PythonToSQLite packer = PythonToSQLite("modules.db") # 打包单个模块 packer.pack_module("module.py", "module_name") # 打包整个目录(自动识别包结构) packer.pack_directory("my_package/") # 验证包结构 packer.verify_package_structure() ``` #### 导入模块 ```python from module_bank import PythonToSQLite import sys packer = PythonToSQLite("modules.db") # 安装导入器到sys.meta_path finder = packer.install_importer() # 列出所有可用模块 modules = packer.list_modules() for module in modules: print(f"{module['module_name']} {'[包]' if module['is_package'] else ''}") # 导入数据库中的模块 import my_package import my_package.submodule ``` ## 🏗️ 架构设计 ### 核心组件 ```python src/module_bank/ ├── python_to_sqlite.py # 主打包类 ├── sqlite_module_importer.py # 数据库存储管理器 ├── sqlite_meta_path_finder.py # 元路径查找器 ├── sqlite_module_loader.py # 模块加载器 ├── cli.py # 命令行接口 └── __init__.py # 模块导出 ``` ### 数据流 ```text 1. 打包阶段: .py文件 → 编译为字节码 → 存储到SQLite数据库 2. 导入阶段: 导入请求 → MetaPathFinder查找 → ModuleLoader加载 → 执行模块 ``` ### 数据库模式 ```sql CREATE TABLE python_modules ( module_name TEXT PRIMARY KEY, source_code TEXT, -- 源代码(可选) bytecode BLOB, -- 编译后的字节码 is_package BOOLEAN, -- 是否是包 metadata TEXT, -- 元数据(JSON格式) created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ``` ## 🔧 高级功能 ### 排除模式 ```python # 打包时排除特定文件 packer.pack_directory( "my_project/", exclude_patterns=["*_test.py", "*.pyc", "__pycache__"] ) ``` ### 元数据存储 ```python # 为模块添加元数据 packer.importer.add_module( "my_module", source_code, is_package=False, metadata={"version": "1.0", "author": "me"} ) ``` ### 混合导入 ```python # 可以同时使用文件系统和数据库导入 # 数据库导入器优先级更高 import sys from module_bank import PythonToSQLite packer = PythonToSQLite("modules.db") finder = packer.install_importer() # 插入到meta_path开头 # 如果需要文件系统优先,可以调整插入位置 sys.meta_path.append(finder) ``` ## ⚠️ 注意事项 ### 安全性 - 模块字节码直接执行,确保数据库来源可信 - 生产环境建议添加代码签名验证 ### 兼容性 - 字节码不跨Python版本兼容 - 不支持C扩展模块 - 不支持需要文件系统资源的模块(如__file__依赖) ### 性能 - **启动时**:有一次性数据库查询和反序列化开销 - **运行时**:与传统导入性能相同(使用sys.modules缓存) - **最佳适用**:长期运行的服务、桌面应用 ### 更新模块 ```python # 重新打包会自动更新 packer.pack_module("updated_module.py", "module_name") ``` ### 删除模块 ```sql -- 直接从数据库删除 DELETE FROM python_modules WHERE module_name = 'module_to_remove'; ``` ### 备份与恢复 ```bash # 数据库是单个文件,易于备份 cp modules.db modules.backup.db # 恢复 cp modules.backup.db modules.db ``` ## 📚 应用场景 1. 商业软件分发 - 保护源代码知识产权 2. 插件系统 - 动态加载数据库中的插件模块 3. 教育平台 - 安全分发练习代码 4. 微服务 - 打包多个服务模块到单个文件 5. 嵌入式系统 - 减少文件系统依赖 --- **注意**: 本工具主要用于模块分发和部署场景,不适合开发阶段的频繁修改。