如何将一个链接的DLL和一个pyd文件打包成一个自包含的pyd文件?

我正在build立一个Cython的Python模块链接到一个DLL文件。 为了成功导入我的模块,我需要在Windowssearchpath中有DLL。 否则,典型的错误信息是:

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

有没有办法将DLL直接打包到生成的pyd文件中以使分发更容易?

其中一个例子就是OpenCV发行版,其中分发了一个(巨大的)pyd文件,并且是Python绑定工作所需的唯一文件。

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使用位于modules / python / src2中的一些Python脚本从C ++头文件自动生成这些包装函数。

基本上它解析头文件,并在需要时生成static PyObject关键字。 一旦头创建适当,它只是调用python setup 。 老实说,它可能工作,但我不会建议这种方法。

2. Makefiles

如果你已经使用Makefile,只需创建一个规则来放置你的lib文件。 例如,从我自己的代码:

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 。 我不使用它,但它看起来像它可以缓解你的捆绑问题:

  • 我如何从现有的本地库创建一个Python Wheel?

一旦它wheeled ,你可以像这样pip install some-package.whlpip install some-package.whl