добавлена ​​библиотека типов через makepy для AutoCAD, теперь win32com не работает для AutoCAD - PullRequest
1 голос
/ 27 января 2012

Я уже некоторое время без проблем запускаю win32com для доступа к AutoCAD.Я узнал, что применение утилиты makepy может создать более удобный интерфейс в интерактивном режиме, поэтому я запустил ее и добавил «Библиотеку типов AutoCAD 2006».Теперь некоторые общие атрибуты, к которым я обращался, больше не доступны.Рассмотрим код:

acad = win32com.client("AutoCAD.Application")
doc = acad.Documents.Open('mydoc.dwg')
ms = doc.ModelSpace
count = ms.Count #counts all entities in dwg

for i in range(count):
    item = ms.Item(i)
    if 'block' in item.ObjectName.lower():
        print item.Name

Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "C:\Python27\lib\site-packages\win32com\client\__init__.py", line 462, in 
  __getattr__ raise AttributeError("'%s' object has no attribute '%s'" 
  (repr(self),attr))
AttributeError: '<win32com.gen_py.AutoCAD 2006 Type Library.IAcadEntity instance 
  at 0x34894552>' object has no attribute 'Name'

Имя всегда было доступным атрибутом блока, пока я не запустил makepy.Я попытался переустановить Python для Windows, чтобы увидеть, если это сбросит его, но это не сработало.

Создает ли makepy при реализации другой файл, который мне нужно удалить?

Так много моих скриптов зависят от атрибута Name.Будем весьма благодарны за любые предложения или помощь, которые вы можете предложить.

Ответы [ 2 ]

1 голос
/ 23 августа 2018

Основная причина этой ошибки атрибута заключается в том, что ваш COM-сервер перешел с позднего связывания (динамическое) на раннее связывание (статическое).

  • В позднем связывании, всякий раз, когда вызывается метод, объект запрашивается для метода, и если он завершается успешно, то может быть выполнен вызов.
  • В раннем связывании информация об объектной модели определяется заранее из информации о типе, предоставленной вызовом объекта. Раннее связывание использует MakePy. Кроме того, раннее связывание чувствительно к регистру.

Существует два способа решения этой проблемы:

  1. Используйте динамический модуль, чтобы заставить ваш код работать с поздней привязкой. Пример использования:

    "win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()" 
    
  2. Используйте ключевые слова, чувствительные к верблюдам, для раннего ориентированного пути. Пример использования:

    "excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
    

Поэтому попробуйте использовать dynamic.Dispatch или регистрозависимые имена переменных.

0 голосов
/ 26 марта 2015

Я сталкиваюсь с подобной проблемой, когда запускаю win32com для доступа к DELMIA.я обнаружил, что в delmia есть много ком-файлов в виде файлов .tlb.когда я набираю:

from win32com.client.gencache import EnsureDispatch
EnsureDispatch('DELMIA.Application')

python автоматически сгенерирует некоторые вещи в каталоге win32com \ gen_py, как в примере с word или excel.но разница в том, что сгенерированный материал взят только из одного файла .tlb delmia.если я получаю доступ к некоторой переменной в tlb, все в порядке:

docs = delmia.Documents

, если я получаю доступ к некоторой переменной в другом tlb, я встречаю похожую ошибку:

pdoc = docs.Add('Process')

python говорит, что "... У объекта нет атрибута ... ".

, поэтому я удаляю все файлы в каталоге win32com \ gen_py, но сохраняю каталог gen_py, и теперь все нормально.

...