2026-01-23 14:45:49 +08:00
|
|
|
|
# Python Module Bank - SQLite 模块打包系统
|
|
|
|
|
|
|
|
|
|
|
|
一个将Python模块打包到SQLite数据库,并支持从数据库直接导入模块的工具系统。
|
|
|
|
|
|
|
|
|
|
|
|
## 🌟 特性
|
|
|
|
|
|
|
|
|
|
|
|
- **单文件分发** - 将所有模块打包到单个SQLite数据库文件
|
|
|
|
|
|
- **源代码保护** - 模块以编译后的字节码形式存储
|
|
|
|
|
|
- **动态导入** - 运行时直接从数据库加载模块,无需文件系统
|
|
|
|
|
|
- **完整包支持** - 支持包结构和子模块导入
|
|
|
|
|
|
- **CLI工具** - 提供完整的命令行接口
|
|
|
|
|
|
- **导入钩子** - 无缝集成Python导入系统
|
|
|
|
|
|
|
|
|
|
|
|
## 📦 安装
|
|
|
|
|
|
|
|
|
|
|
|
### 从源码安装
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-01-23 15:24:51 +08:00
|
|
|
|
git clone http://124.71.68.6:3000/chakcy/module_bank.git
|
|
|
|
|
|
cd module-bank
|
2026-01-23 14:45:49 +08:00
|
|
|
|
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
|
|
|
|
|
|
# 打包模块或目录
|
2026-01-23 15:24:51 +08:00
|
|
|
|
mb pack my_package --db modules.db
|
2026-01-23 14:45:49 +08:00
|
|
|
|
|
|
|
|
|
|
# 列出数据库中的模块
|
2026-01-23 15:24:51 +08:00
|
|
|
|
mb list --db modules.db
|
2026-01-23 14:45:49 +08:00
|
|
|
|
|
|
|
|
|
|
# 安装导入器并进入交互模式
|
2026-01-23 15:24:51 +08:00
|
|
|
|
mb install --db modules.db
|
2026-01-23 14:45:49 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 编程接口
|
|
|
|
|
|
|
|
|
|
|
|
#### 打包模块
|
|
|
|
|
|
|
|
|
|
|
|
```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. 嵌入式系统 - 减少文件系统依赖
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
**注意**: 本工具主要用于模块分发和部署场景,不适合开发阶段的频繁修改。
|