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. Кроме того, раннее связывание чувствительно к регистру.

Есть два способа решить эту проблему:

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

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

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

Кроме того, я думаю, что при использовании зависимых от раннего связывания методов по умолчанию каждый раз создается папка gen_py.

Собственно проблема здесь в том, что по какой-то причине вам нужно приводить объекты

      csbTstMod = win32com.client.CastTo(csbTstMod, "ITSTestModule3")
print(csbTstMod.TestVariant)

Теперь это будет работать.

Другие вопросы по тегам