Невозможно загрузить модуль модульного тестирования C++ с Python 3.10 в Windows (с использованием Boost 1.75.0)Python

Программы на Python
Ответить
Anonymous
 Невозможно загрузить модуль модульного тестирования C++ с Python 3.10 в Windows (с использованием Boost 1.75.0)

Сообщение Anonymous »

У меня возникла сложная проблема с управлением модульными тестами моего проекта C++ на Python.
Проект
Проект большой, сильно зависящий от повышения, с несколькими файлами dll/so, а функциональные возможности экспортируются в Python. Поэтому я не могу скопировать код, и мне сложно извлечь из всего этого минимальный образец. Более того, я почти уверен, что это скорее проблема конфигурации, чем проблема кода. Однако я приведу пример кода, касающийся критической части.
Проблема
У меня есть модуль тестовая программа на C++, которую я могу использовать в Python. Он хорошо работает как для Python 3.8, так и для 3.9. Он также работает с Python 3.10 в Linux, но в Windows я получаю следующее сообщение:

Код: Выделить всё

 : DLL load failed while importing UnitTestTools_4_1_0_0_beta_x64: The specified module was not found.
Я проверил зависимости, все они существуют, и все их местоположения указаны в sys.path. Я использую sys.path.insert(0, dirPath), чтобы добавить каталог, содержащий файлы dll/so и pyd. Я также проверил с помощью DependencyGui.exe.
Более того, я могу использовать все возможности своего проекта, т. е. могу импортировать другие файлы и вызывать содержащиеся в них функции. Только модульный тест в Windows с Python 3.10 не может импортировать соответствующий модуль.
Конфигурация
На стороне C++ я использую boost 1.75.0 и собираю проект с помощью Visual Studio 2019 в Windows и gcc 9.4 в Linux.
Единственные библиотеки, которые мне нужны для взаимодействия с C++ и Python, — это boost_python и boost_numpy.
Я создал библиотеки boost из исходных кодов (с некоторыми исправлениями для удовлетворения новейших требований Python) с выделенными виртуальными средами Anaconda для каждой версии Python, которую мне нужно поддерживать (3.8, 3.9 и 3.10). ).
На стороне Python, когда я использую свои библиотеки в Python, я использую среду Anaconda по умолчанию, настроенную во время установки. Я не буду перечислять все установленные модули (при необходимости могу предоставить больше), но вот сравнение версий Python и numpy:

Код: Выделить всё

               | Windows | Linux
---------------+---------|-------
Python version |  3.9.13 | 3.9.7
Numpy version  |  1.24.1 | 1.26.3
---------------+---------|-------
Python version |  3.10.9 | 3.10.9
Numpy version  |  1.23.5 | 1.23.5
Я также пробовал использовать несколько версий numpy для Windows/Python 3.10 (например, 1.24.1).
Я обнаружил, что произошло изменение в ABI между 3.9 и 3.10, но я не думаю, что это причина моей проблемы, поскольку она работает в Linux.
Попытки решения
Подводя итог всем моим попыткам решить проблему, вот что я сделал:
  • проверил, существуют ли зависимости моего pyd
    проверьте содержимое sys.path
  • создайте boost 1.75.0 с одной и той же версией numpy для всех версий Python
  • настроить среду Python с несколькими версиями numpy
Пример кода
На случай, если это поможет, я скопирую часть кода, касающуюся экспорт модуля модульного теста

Код: Выделить всё

pythonMajorVersion = sys.version_info.major
pythonMinorVersion = sys.version_info.minor
pythonVersionSubDir = "Python" + str(pythonMajorVersion) + "_" + str(pythonMinorVersion)

# add of binary directory to path
binaryDir = getBinDir() # Directory where the dlls are stored
if not binaryDir in sys.path:
sys.path.insert(1, binaryDir)
if os.name == "nt":
os.environ["PATH"] = os.environ["PATH"] + ";"  + binaryDir
# The python pyds are located in a specific subdirectory called "Python3_8",  "Python3_9" or  "Python3_10" depending on the python I'm using
pythonBinaryDir = os.path.join(binaryDir, pythonVersionSubDir)
if not pythonBinaryDir in sys.path:
sys.path.insert(1, pythonBinaryDir)
if os.name == "nt":
os.environ["PATH"] = os.environ["PATH"] + ";"  + pythonBinaryDir

# Generate the full module name, for instance 'PyUnitTestTools_1_0_0_0_x64', 1.0.0.0 being the version number
unitTestModuleName = getLibName("PyUnitTestTools")

try:
self.unittest = import_module(unitTestModuleName)
except:
print("Failed to initialize unit test framework\n" + str(sys.exc_info()[0]) + " : " + str(sys.exc_info()[1]))
Я не уверен, что добавление каталогов библиотек как в sys.path, так и в os.environ["PATH"] необходимо, но я попробовал на всякий случай это может помочь.
Не могу ли я загрузить модуль модульного тестирования в этой конкретной конфигурации (Windows, Python 3.10)?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ost-1-75-0
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»