#!/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()