Files
sanguo_vnpy/archive/2026-04-29-cleanup/scripts/deployment/fix_vnpy_imports.py
T
2026-04-29 20:15:43 +08:00

233 lines
6.4 KiB
Python
Executable File

#!/usr/bin/env python3
"""
修复vn.py模块导入问题
解决"No module named 'vnpy.app'"错误
"""
import os
import sys
def check_vnpy_structure():
"""检查vn.py模块结构"""
print("检查vn.py模块结构...")
try:
import vnpy
print(f"✅ vnpy版本: {getattr(vnpy, '__version__', '未知')}")
# 检查模块路径
vnpy_path = vnpy.__file__
vnpy_dir = os.path.dirname(vnpy_path)
print(f"vn.py路径: {vnpy_path}")
print(f"vn.py目录: {vnpy_dir}")
# 列出所有子模块
if os.path.exists(vnpy_dir):
submodules = []
for item in os.listdir(vnpy_dir):
item_path = os.path.join(vnpy_dir, item)
if os.path.isdir(item_path) and not item.startswith('_'):
submodules.append(item)
print(f"vn.py子模块: {submodules}")
return submodules
else:
print("❌ vn.py目录不存在")
return []
except ImportError as e:
print(f"❌ 无法导入vnpy: {e}")
return []
def check_imports():
"""检查常见的vn.py导入"""
print("\n检查vn.py模块导入...")
imports_to_check = [
# 核心模块
('vnpy', '✅ vnpy核心模块'),
('vnpy.trader', '✅ vnpy.trader模块'),
('vnpy.event', '✅ vnpy.event模块'),
('vnpy.trader.engine', '✅ vnpy.trader.engine模块'),
# 应用模块(可能不存在)
('vnpy.app', '❌ vnpy.app模块(可能已废弃)'),
('vnpy.trader.app', '✅ vnpy.trader.app模块'),
# 策略模块
('vnpy_ctastrategy', '✅ vnpy_ctastrategy模块'),
('vnpy_ctabacktester', '✅ vnpy_ctabacktester模块'),
# 其他组件
('vnpy_webtrader', '✅ vnpy_webtrader模块'),
('vnpy_datamanager', '✅ vnpy_datamanager模块'),
]
results = []
for import_str, description in imports_to_check:
try:
__import__(import_str)
results.append((import_str, description.replace('', '').replace('(可能已废弃)', '')))
except ImportError as e:
results.append((import_str, f"{description}: {e}"))
for import_str, result in results:
print(f"{result}")
return results
def create_import_fix_guide():
"""创建导入修复指南"""
print("\n" + "="*60)
print("vn.py 4.x版本导入修复指南")
print("="*60)
guide = """
## 问题: 无法导入 vnpy.app
### 原因:
vn.py 4.x版本中,模块结构发生了变化:
- vn.py 3.x: 使用 `vnpy.app.xxx` 格式
- vn.py 4.x: 使用 `vnpy_xxx` 或 `vnpy.trader.app` 格式
### 解决方案:
#### 1. 替换导入语句
```python
# ❌ 旧版本 (vn.py 3.x)
from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.cta_backtester import CtaBacktesterApp
# ✅ 新版本 (vn.py 4.x)
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
```
#### 2. 使用正确的模块路径
```python
# ❌ 错误
import vnpy.app
# ✅ 正确
import vnpy.trader.app # 如果存在
import vnpy_ctastrategy # 策略应用
import vnpy_ctabacktester # 回测应用
```
#### 3. 检查并更新代码
如果代码中使用了 `vnpy.app`,需要更新为:
```python
# 查找并替换
- vnpy.app. → vnpy_ # 大部分情况
- vnpy.app → vnpy.trader # 少数情况
```
#### 4. 验证修复
```python
# 测试新导入
try:
from vnpy_ctastrategy import CtaTemplate
print("✅ vnpy_ctastrategy 导入成功")
except ImportError as e:
print(f"❌ 导入失败: {e}")
# 安装缺失模块
# pip install vnpy-ctastrategy
```
"""
print(guide)
# 创建修复脚本示例
fix_script = '''#!/usr/bin/env python3
"""
vn.py 4.x 兼容性修复脚本
"""
import os
import re
def fix_vnpy_imports(file_path):
"""修复文件中的vn.py导入"""
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 替换规则
replacements = [
(r'from vnpy\.app\.', 'from vnpy_'),
(r'import vnpy\.app\.', 'import vnpy_'),
(r'vnpy\.app\.cta_strategy', 'vnpy_ctastrategy'),
(r'vnpy\.app\.cta_backtester', 'vnpy_ctabacktester'),
(r'vnpy\.app\.data_manager', 'vnpy_datamanager'),
(r'vnpy\.app\.rpc_service', 'vnpy_rpcservice'),
(r'vnpy\.app\.algo_trading', 'vnpy_algotrading'),
]
fixed_content = content
for pattern, replacement in replacements:
fixed_content = re.sub(pattern, replacement, fixed_content)
if fixed_content != content:
# 备份原文件
backup_path = file_path + '.backup'
os.rename(file_path, backup_path)
# 写入修复后的文件
with open(file_path, 'w', encoding='utf-8') as f:
f.write(fixed_content)
print(f"✅ 已修复: {file_path}")
print(f" 备份: {backup_path}")
return True
else:
print(f"✅ 无需修复: {file_path}")
return False
# 使用示例
if __name__ == "__main__":
# 修复当前目录下的Python文件
for root, dirs, files in os.walk('.'):
for file in files:
if file.endswith('.py'):
file_path = os.path.join(root, file)
fix_vnpy_imports(file_path)
'''
fix_script_path = "fix_vnpy_imports_script.py"
with open(fix_script_path, 'w', encoding='utf-8') as f:
f.write(fix_script)
print(f"✅ 已创建修复脚本: {fix_script_path}")
print(f"使用方式: python {fix_script_path}")
def main():
"""主函数"""
print("🚀 开始诊断vn.py模块导入问题")
print("="*60)
# 检查vn.py结构
submodules = check_vnpy_structure()
# 检查导入
results = check_imports()
# 创建修复指南
create_import_fix_guide()
print("\n" + "="*60)
print("诊断完成")
print("="*60)
# 总结
missing_app = any('vnpy.app' in result[0] and '' in result[1] for result in results)
if missing_app:
print("🎯 问题确认: vnpy.app模块缺失")
print("解决方案:")
print("1. 更新代码使用vn.py 4.x兼容的导入")
print("2. 或降级vn.py到3.x版本")
print("3. 建议使用方案1(更新代码)")
else:
print("✅ 所有vn.py模块导入正常")
if __name__ == "__main__":
main()