Подтвердить что ты не робот

Как упаковать связанную DLL и файл pyd в один автономный файл pyd?

Я создаю модуль python с Cython, который ссылается на DLL файл. Чтобы успешно импортировать мой модуль, мне нужно иметь DLL в пути поиска Windows. В противном случае типичное сообщение об ошибке:

ImportError: DLL load failed: The specified module could not be found.

Есть ли способ упаковать DLL непосредственно в полученный файл pyd, чтобы облегчить распространение?

Одним из примеров этого является дистрибутив OpenCV, где распределяется (огромный) файл pyd и является единственным файлом, необходимым для работы связок Python.

4b9b3361

Ответ 1

Упаковка и развертывание Python по-прежнему являются для многих из нас причиной боли. Просто нет серебряной пули. Вот несколько способов:


1. Метод сборки OpenCV

Здесь описывается метод: https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_bindings/py_bindings_basics/py_bindings_basics.html#bindings-basics

OpenCV автоматически генерирует эти функции обертки из С++ с использованием некоторых скриптов Python, которые расположены в Модули/питон/src2.

В принципе, он анализирует файлы заголовков и генерирует ключевые слова static PyObject всякий раз, когда это необходимо. Как только заголовок создается соответствующим образом, он просто вызывает python setup. Честно говоря, это может сработать, но я бы не посоветовал этот метод.

2. Makefiles

Если вы уже используете Makefile, просто создайте правило, чтобы разместить lib accordinlgy. Пример из моего собственного кода:

setup.py

from distutils.core import setup, Extension
setup(name='sha1_hmac', version='1.0',  \
      ext_modules=[Extension('sha1_hmac',
                             library_dirs=['C:\MinGW\lib'],
                             sources= ['../tools/sha1.c','sha1_hmac.c'])])

Makefile

# The hmac generation used by the webserver is done
# using the sha1.c implementation. There is a binding needed to
# glue the C code with the python script
libsha1_hmac:
ifeq ($(OS), Windows_NT)
    $(PYTHON) setup.py build --compiler=mingw32
else
    $(PYTHON) setup.py install --home=$(CURDIR)
endif

.PHONY: webserver
webserver:  libsha1_hmac
ifeq ($(OS), Windows_NT)
    mv $(shell find build -type f -name "sha1*.pyd") $(LIB)
else
    mv -f $(shell find $(LIB)/python -type f -name "sha1*.so") $(LIB)
endif
    $(PYTHON) hmac_server.py

3. Современные инструменты развертывания

Существует несколько новых инструментов для развертывания приложений python, а именно wheels, которые, похоже, набирают силу. Я не использую его, но похоже, что он может облегчить вашу проблему с пакетом:

После wheeled вы можете установить его следующим образом: pip install some-package.whl