You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:08:20