Python DispatchWithEvents приводит к ошибке атрибута:
Использование отправки как win32com.client.Dispatch
работает нормально, но выдает attribute error:
из вызова DispatchWithEvents win32com.client.WithEvents
проблема существует до Temp\gen_py
папка удалена
Я могу удалить Temp\gen_py
папка в самом начале раньше import win32com.client
path=r"C:\Users\omc\AppData\Local\Temp\gen_py"
rmtree(path, ignore_errors=True)
while os.path.exists(path):
pass
отлично работает для 1-й итерации в моем тесте, но для 2-й итерации для того же кода выдает attribute error:
from shutil import rmtree
path=r"C:\Users\omc\AppData\Local\Temp\gen_py"
rmtree(path, ignore_errors=True)
while os.path.exists(path):
pass
import win32com.client
class CanoeTestModuleEvents(object):
"""Handler for CANoe TestModule events"""
def OnStart(self):
print("< Test Module started >")
bTestModuleRunning = True
def OnStop(self,Reason) :
print("< Test Module stopped >")
bTestModuleRunning = False
if Reason == 0:
print("Test module was executed completely")
else:
if Reason== 1:
print("Test module was stopped by the user")
else:
print("Test module was stopped by measurement stop")
APP = win32com.client.Dispatch("CANoe.Application")
App.load("CANoeApplication.cfg")
# ---------------------------------------------------------------
# TestEnvironment Item(2)
# ---------------------------------------------------------------
TestEnvironment = self.App.Configuration.TestSetup.TestEnvironments.Item(1)
TestModule = self.TestEnvironment.Items.Item(2)
TestModule.TestVariant = TestVariant
App.Measurement.Start()
WaitForMeasurementStart()
win32com.client.WithEvents(TestModule, CanoeTestModuleEvents)
if MeasurementRunning():
TestModule.Start()
WaitForTestModuleStart()
while app.bTestModuleRunning == True:
pythoncom.PumpWaitingMessages()
time.sleep(.1)
App.Measurement.Stop()
# ---------------------------------------------------------------
# TestEnvironment Item(3)
# ---------------------------------------------------------------
TestEnvironment = self.App.Configuration.TestSetup.TestEnvironments.Item(1)
TestModule = self.TestEnvironment.Items.Item(3)
TestModule.TestVariant = TestVariant
App.Measurement.Start()
WaitForMeasurementStart()
win32com.client.WithEvents(TestModule, CanoeTestModuleEvents)
if MeasurementRunning():
TestModule.Start()
WaitForTestModuleStart()
while app.bTestModuleRunning == True:
pythoncom.PumpWaitingMessages()
time.sleep(.1)
App.Measurement.Stop()
AttributeError: объект не имеет атрибута
AttributeError: '<win32com.gen_py.CANoe 8.5 Type Library.ITestSetupItem instance at 0x49756368>' object has no attribute 'TestVariant'
2 ответа
Основная причина этой ошибки атрибута заключается в том, что ваш COM-сервер перешел с позднего связывания (динамическое) на раннее связывание (статическое).
- В позднем связывании, всякий раз, когда вызывается метод, объект запрашивается для метода, и если он завершается успешно, то может быть выполнен вызов.
- В раннем связывании информация об объектной модели определяется заранее из информации о типе, предоставляемой вызовом объекта. Раннее связывание использует MakePy. Кроме того, раннее связывание чувствительно к регистру.
Есть два способа решить эту проблему:
Используйте динамический модуль, чтобы заставить ваш код работать с поздней привязкой. Пример использования:
"win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()"
Используйте ключевые слова, чувствительные к Camelcase, для раннего ориентированного пути. Пример использования:
"excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
Кроме того, я думаю, что при использовании зависимых от раннего связывания методов по умолчанию каждый раз создается папка gen_py.
Собственно проблема здесь в том, что по какой-то причине вам нужно приводить объекты
csbTstMod = win32com.client.CastTo(csbTstMod, "ITSTestModule3")
print(csbTstMod.TestVariant)
Теперь это будет работать.