Проект
Проект большой, сильно зависящий от повышения, с несколькими файлами 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.
Более того, я могу использовать все возможности своего проекта, т. е. могу импортировать другие файлы и вызывать содержащиеся в них функции. Только модульный тест в 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
Я обнаружил, что произошло изменение в 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]))
Не могу ли я загрузить модуль модульного тестирования в этой конкретной конфигурации (Windows, Python 3.10)?
Подробнее здесь: https://stackoverflow.com/questions/792 ... ost-1-75-0
Мобильная версия