使用python 2.7中的comtypes获取正在运行的AutoCAD应用程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python 2.7中的comtypes获取正在运行的AutoCAD应用程序相关的知识,希望对你有一定的参考价值。

我正在尝试获取一个实例以指向已经运行的AutoCAD 2016应用程序,或者如果它未运行则创建一个新实例。

这是一个简单的代码示例:

#Import needed modules
import os
import comtypes.client
from comtypes import COMError
from comtypes.client import CreateObject, GetModule, GetActiveObject

try:
        acad = GetActiveObject("AutoCAD.Application.20")
        print "AutoCAD is Active"
        print "########"
except(OSError, COMError): #If AutoCAD isn't running, run it
        acad = CreateObject("AutoCAD.Application.20",dynamic=True)
        print "AutoCAD is successfuly Opened"
        print "########"

当AutoCAD未运行时,函数CreateObject成功运行并且仅当dynamic设置为true ..但GetActiveObject抛出Traceback错误

  File "C:Python27libsite-packagescomtypesclient\__init__.py", line 250, in CreateObject
    return _manage(obj, clsid, interface=interface)
  File "C:Python27libsite-packagescomtypesclient\__init__.py", line 188, in _manage
    obj = GetBestInterface(obj)
  File "C:Python27libsite-packagescomtypesclient\__init__.py", line 112, in GetBestInterface
    interface = getattr(mod, itf_name)
AttributeError: 'module' object has no attribute 'IAcadApplication'

我见过this,但没有任何线索。

此外,我已经回到了comtypes的文档,它说

当COM对象已在运行时,GetActiveObject函数成功,并已在COM运行对象表中注册自身。并非所有COM对象都执行此操作。

但这也没有给我任何线索。

P.Sazxswpoi与我一起使用ETABS 2016和SAP2000 v18等其他应用程序

任何帮助和有见地的回应将完全被感谢,提前感谢

答案

这很奇怪,但它确实有效(至少对我而言)

我去了GetActiveObject文件夹,它的完整路径是gen,然后查找文件AutoCAD.py,在IDLE中打开它,知道它等效生成的符号(ID),如C:Python27Libsite-packagescomtypesgen,然后删除这4个文件:

  1. AutoCAD.朋友
  2. AutoCAD.pyc
  3. _4E3F492A_FB57_4439_9bf0_1567Ed84A3A9_0_1_0.朋友
  4. _4E3F492A_FB57_4439_9BF0_1567ED84A3A9_0_1_0.pyc

您可以注意到,最后2个文件由AutoCAD.py文件中提到的相同的等效生成符号命名。

以上是关于使用python 2.7中的comtypes获取正在运行的AutoCAD应用程序的主要内容,如果未能解决你的问题,请参考以下文章

linux下输入python setup.py install(安装comtypes-0.6.2),出错。

python脚本切换wifi-pywifi使用

(Python 2.7)获取UI标题栏大小

我的元组中的那些小“u”是啥? (python 2.7)[重复]

获取时间戳而不是日期时间对象,sqlalchemy python 2.7

在 Python 2.7 中获取代码块的执行时间