如何在Python中获取Windows系统上AutoCAD的完整版本名称?
获取AutoCAD各垂直版本的完整名称与版本号
你的现有脚本只能捕获到acad.exe进程名,要获取AutoCAD垂直版本的完整名称(如AutoCAD Civil 3D 2016),可以通过以下两种可靠方法实现:
方法一:读取进程文件的版本资源信息
每个AutoCAD版本的acad.exe文件都包含完整的产品名称和版本号在其文件属性的版本信息中,通过读取这些属性即可获取目标内容。
实现代码
首先安装依赖库:
pip install pywin32 wmi
然后编写监控脚本:
import wmi import win32api def get_autocad_full_info(exe_path): try: # 读取文件版本信息 version_info = win32api.GetFileVersionInfo(exe_path, "\\") product_name = version_info["ProductName"] product_version = version_info["ProductVersion"] return f"{product_name} (版本: {product_version})" except Exception: return None # 初始化WMI监控 c = wmi.WMI() # 只监控acad.exe的进程创建事件 process_watcher = c.Win32_Process.watch_for("creation", ProcessName="acad.exe") print("开始监控AutoCAD启动...") while True: try: event = process_watcher() exe_path = event.ExecutablePath if exe_path: full_info = get_autocad_full_info(exe_path) if full_info: print(f"检测到启动: {full_info}") else: print(f"检测到acad.exe启动,但无法获取版本信息,路径: {exe_path}") except KeyboardInterrupt: print("\n监控已终止") break
方法二:结合注册表信息匹配
AutoCAD安装时会在Windows注册表中写入产品名称、安装路径等信息,可提前读取注册表数据,再通过进程的安装路径匹配对应的完整名称。
实现代码
import wmi import winreg import win32api def load_autocad_registry_data(): autocad_map = {} try: # 打开AutoCAD注册表根项 root_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Autodesk\AutoCAD") idx = 0 while True: try: # 枚举所有版本子键 subkey_name = winreg.EnumKey(root_key, idx) subkey_path = fr"SOFTWARE\Autodesk\AutoCAD\{subkey_name}" subkey = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, subkey_path) # 获取产品名称和安装路径 product_name, _ = winreg.QueryValueEx(subkey, "ProductName") install_path, _ = winreg.QueryValueEx(subkey, "InstallPath") # 用小写路径作为键,避免大小写匹配问题 autocad_map[install_path.lower()] = product_name winreg.CloseKey(subkey) idx += 1 except OSError: break winreg.CloseKey(root_key) except Exception as e: print(f"读取注册表失败: {str(e)}") return autocad_map # 预加载注册表中的AutoCAD信息 autocad_reg_data = load_autocad_registry_data() # 初始化WMI监控 c = wmi.WMI() process_watcher = c.Win32_Process.watch_for("creation", ProcessName="acad.exe") print("开始监控AutoCAD启动...") while True: try: event = process_watcher() exe_path = event.ExecutablePath if exe_path: # 提取安装目录(去掉末尾的acad.exe) install_dir = "\\".join(exe_path.split("\\")[:-1]).lower() # 从注册表匹配名称 product_name = autocad_reg_data.get(install_dir) if product_name: print(f"检测到启动: {product_name}") else: # 注册表匹配失败时, fallback到文件版本信息 try: version_info = win32api.GetFileVersionInfo(exe_path, "\\") product_name = version_info["ProductName"] print(f"检测到启动: {product_name}") except: print(f"检测到acad.exe启动,路径: {exe_path},无法获取完整名称") except KeyboardInterrupt: print("\n监控已终止") break
两种方法对比
- 文件版本法:无需依赖注册表,只要能获取进程的可执行文件路径就能读取信息,兼容性好,适用于所有AutoCAD版本。
- 注册表法:提前加载数据,匹配速度快,但如果注册表写入异常(如绿色版AutoCAD)会失效,建议结合文件版本法做兜底。
内容的提问来源于stack exchange,提问作者Anup Kumar Mohapatra
相关产品推荐
相关产品推荐

