У меня есть DLL, написанная на C ++, которую я хочу экспортировать в Python для запуска регрессии и модульного тестирования (проще поддерживать и запускать регрессию с Python).
Для этого я хочу использовать Boost.Python для экспорта основного API библиотеки DLL, чтобы он мог использоваться в Python.
Мои сборки выглядят следующим образом:
BOOST_PYTHON_MODULE
экспорт определений (зависит от MyLibrary.dll)У меня были некоторые проблемы с получением ссылки MyLibrary.pyd, но после того, как я немного перебрал вопросы (например, Вот) Я понял, что мне нужно пересобрать буст, указывая b2.exe
к моей конкретной версии Python. После чего я смог импортировать и запустить мою библиотеку из Python (на моя машина одна).
Технические данные: я собираю библиотеки с boost 1.51, Python 3.23 для Windows 7 x64 и MSVC-10.0 (мои собственные проекты созданы на основе VS2010). Вариант, который я использую для связи с boost, — это разделяемые библиотеки, 64-адресная модель, выпускаемая соответственно с моими собственными сборками.
Проблема в том, что когда я пытаюсь импортировать библиотеку (созданную на моей машине) на другую машину, python жалуется:
ImportError: DLL load failed: The specified procedure could not be found.
На линии import MyLibrary
Что вызывает следующие вопросы:
Взгляните на PEP 384 на http://docs.python.org/3.2/whatsnew/3.2.html.
http://www.boost.org/doc/libs/1_52_0/libs/python/doc/news.html показывает, что в последнее время не было никакого реального прогресса, поэтому я сомневаюсь, что Boost.Python поддерживает или, по крайней мере, был протестирован с определенным Py_LIMITED_API.
Согласно моему опыту с Python 2.x совместимостью с использованием обоих Boost.Python и PyCXX (я еще не работал со строкой 3.x):
Мой совет — попытаться собрать Boost из исходного кода с определенным Py_LIMITED_API. Я не гарантирую, что это удастся, но это стоит попробовать.
Если это не помогло, попросите своих товарищей по команде использовать ту же версию Python, что и у вас, и, конечно же, 64-битную Windows (так как .pyd сам по себе является 64-битным). Или даже лучше настроить компьютер CI, который будет собирать ваш модуль python в каждой требуемой конфигурации, чтобы ваши клиенты могли выбрать правильный двоичный файл. Пусть ваши товарищи по команде создают и используют свои собственные версии MyLibrary.pyd только для локального использования.
Других решений пока нет …