233 lines
6.4 KiB
Python
Executable File
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() |