initial-import: 2026-04-11 21:18:55
This commit is contained in:
@@ -0,0 +1,233 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user