module_bank/README.md
2026-01-23 15:24:51 +08:00

252 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. 嵌入式系统 - 减少文件系统依赖
---
**注意**: 本工具主要用于模块分发和部署场景,不适合开发阶段的频繁修改。