Я использую Imatest IT (v5.0.1) и мне нужно использовать Imatest IT-тесты с моим кодом Python, однако мой код Python также взаимодействует с API-интерфейсом Python для MATLAB (2017b), и, похоже, существует конфликт.

Ниже вы можете увидеть, что попытка импортировать ImatestLibrary после импорта matlab.engine приводит к исключению. Простой импорт того или другого не вызывает проблем.

import matlab.engine
from imatest.it import ImatestLibrary

Exception caught during initialization of Python interface. Details: DLL load failed: The specified procedure could not
be found.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python34\lib\site-packages\imatest\it.py", line 6, in <module>
    import imatest.library
  File "C:\Python34\lib\site-packages\imatest\library\__init__.py", line 279, in <module>
    _pir.import_cppext()
  File "C:\Python34\lib\site-packages\imatest\library\__init__.py", line 272, in import_cppext
    self.cppext_handle = importlib.import_module("matlabruntimeforpython" + self.interpreter_version)
  File "C:\Python34\lib\importlib\__init__.py", line 109, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ImportError: DLL load failed: The specified procedure could not be found.

Есть ли способ решить эту проблему?

1
PJD 20 Авг 2018 в 14:00

3 ответа

Лучший ответ

Обходным путем, который я использовал, было создание новых процессов с использованием многопроцессорного модуля Python. Процессы будут использовать либо библиотеки MATLAB, либо библиотеки Imatest. Дополнительный слой кода, но это работает.

0
PJD 30 Авг 2018 в 02:38

Какую версию Python вы используете? Возможно, это не одна из поддерживаемых Matlab версий для 2017b, которые ограничены. Я забыл, что именно, но я думаю, что 2,7, 3,3, 3,4 и, возможно, 3,5

0
anjhinz 21 Авг 2018 в 14:18

Согласно документации интерфейса Imatest Python относительно импорта {{X0} } :

За кулисами конструктор ImatestLibrary запустит среду выполнения Matlab MCR и загрузит все IT-библиотеки в память.

Это говорит о том, что imatest сам мешает состоянию движка MATLAB. Хотя порядок импорта обычно не имеет значения, иногда для правильной инициализации иногда должны происходить определенные операции импорта перед другими, когда модули, импортируемые позже, полагаются на модули, импортированные ранее (например, сначала импортируют matplotlib и устанавливают серверную часть перед импортом {{ X2}} что бы использовать указанного бэкэнда).

Поэтому мое единственное предложение - попытаться изменить порядок импорта, чтобы посмотреть, поможет ли это. Если это не так, то вам не повезло (что касается переполнения стека): и MATLAB, и Imatest являются дорогостоящими проприетарными (и даже закрытыми) продуктами, поэтому вы должны подавать отчеты об ошибках в один или оба из них, потому что никто еще будет в состоянии сказать, если и как конфликт может быть исправлен.

1
Andras Deak 20 Авг 2018 в 11:25
51929303