CadHubManage/check_pdms_processes.py
root 664181ec6b feat: 集成AVEVA PDMS 12.1 SP4支持
- 添加PDMS软件配置,支持批处理文件启动方式
- 配置executable_path为pdms.bat,startup_args为["Design", "noconsole"]
- 通过进程检测工具确定正确的进程名称:des.exe和PDMSConsole.exe
- 新增check_pdms_processes.py进程检测工具,可自动识别PDMS进程
- 更新Readme.md和frontend-api-docs.md文档
- 支持与Creo、Revit一致的启动、停止、重启功能

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-01 21:14:32 +08:00

117 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sys
import asyncio
import psutil
sys.path.append('app')
from core.process_monitor import process_monitor
async def detect_pdms_processes():
"""检测PDMS相关的所有进程"""
print("=== PDMS进程检测工具 ===")
print("请确保PDMS已经启动然后按任意键继续...")
input()
print("\n正在扫描系统中的所有进程...")
# 获取所有进程
all_processes = []
pdms_related_processes = []
try:
for proc in psutil.process_iter(['pid', 'name', 'create_time', 'cmdline']):
try:
proc_info = proc.info
all_processes.append(proc_info)
# 查找可能与PDMS相关的进程
process_name = proc_info['name'].lower() if proc_info['name'] else ''
cmdline_list = proc_info.get('cmdline') or []
if not isinstance(cmdline_list, list):
cmdline_list = []
cmdline = ' '.join(str(arg) for arg in cmdline_list).lower()
# 检查进程名或命令行中是否包含PDMS关键词
pdms_keywords = ['pdms', 'aveva', 'design', 'plant']
if any(keyword in process_name for keyword in pdms_keywords) or \
any(keyword in cmdline for keyword in pdms_keywords):
pdms_related_processes.append({
'pid': proc_info['pid'],
'name': proc_info['name'],
'cmdline': cmdline_list,
'create_time': proc_info['create_time']
})
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
continue
except Exception as e:
print(f"❌ 进程扫描失败: {e}")
return
print(f"\n📊 扫描结果:")
print(f" 总进程数: {len(all_processes)}")
print(f" PDMS相关进程数: {len(pdms_related_processes)}")
if not pdms_related_processes:
print("\n⚠️ 未找到PDMS相关进程!")
print(" 请确认:")
print(" 1. PDMS是否已正确启动")
print(" 2. 是否以正确的参数启动 (Design noconsole)")
return
print(f"\n🔍 发现的PDMS相关进程:")
print("-" * 80)
for proc in pdms_related_processes:
cmdline_preview = ' '.join(str(arg) for arg in proc['cmdline'][:3]) if proc['cmdline'] else ''
print(f"PID: {proc['pid']:8} | 进程名: {proc['name']:20} | 命令行: {cmdline_preview}")
# 分析最有可能的主进程
print(f"\n🎯 进程分析建议:")
print("-" * 40)
main_candidates = []
for proc in pdms_related_processes:
name = proc['name'].lower() if proc['name'] else ''
cmdline_str = ' '.join(str(arg) for arg in proc['cmdline']).lower() if proc['cmdline'] else ''
# 评分系统:更可能是主进程的得分更高
score = 0
if 'pdms' in name:
score += 10
if 'design' in name:
score += 8
if 'design' in cmdline_str:
score += 5
if 'noconsole' in cmdline_str:
score += 3
if len(proc['cmdline']) > 1: # 有参数的进程更可能是主进程
score += 2
main_candidates.append((proc, score))
# 按分数排序
main_candidates.sort(key=lambda x: x[1], reverse=True)
if main_candidates:
top_candidate = main_candidates[0][0]
print(f"推荐的主进程: {top_candidate['name']} (PID: {top_candidate['pid']})")
# 生成配置建议
unique_names = list(set(proc['name'] for proc in pdms_related_processes))
print(f"\n📝 配置文件建议:")
print(f"建议将PDMS的 check_process_name 设置为:")
if len(unique_names) == 1:
print(f' check_process_name: "{unique_names[0]}"')
else:
print(f' check_process_name: {unique_names}')
print(f"\n详细进程名称列表:")
for i, name in enumerate(unique_names, 1):
print(f" {i}. {name}")
print(f"\n=== 检测完成 ===")
if __name__ == "__main__":
asyncio.run(detect_pdms_processes())