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

Python 如何将链接的DLL和pyd文件打包成一个自包含的pyd文件?,python,windows,dll,cython,Python,Windows,Dll,Cython,我正在用Cython构建一个python模块,该模块链接到一个DLL文件。为了成功导入我的模块,我需要在Windows搜索路径中有DLL。否则,典型的错误消息为: ImportError:DLL加载失败:找不到指定的模块。 有没有办法将DLL直接打包到生成的pyd文件中,以使分发更容易 OpenCV发行版就是一个例子,其中分发了一个(巨大的)pyd文件,这是Python绑定工作所需的唯一文件。Python的打包和部署仍然是我们许多人的痛点。只是没有一颗银弹。以下是几种方法: 1.OpenCV构

我正在用Cython构建一个python模块,该模块链接到一个DLL文件。为了成功导入我的模块,我需要在Windows搜索路径中有DLL。否则,典型的错误消息为:

ImportError:DLL加载失败:找不到指定的模块。

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


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

Python的打包和部署仍然是我们许多人的痛点。只是没有一颗银弹。以下是几种方法:


1.OpenCV构建方法 此处描述了该方法:

OpenCV自动生成这些包装函数,从C++ 使用位于 模块/python/src2

基本上,它解析头文件并在需要时生成
静态PyObject
关键字。一旦适当地创建了头,它只需调用
python setup
。老实说,这可能有效,但我不建议使用这种方法

2.生成文件 如果已经使用Makefile,只需创建一个规则,将库按顺序放置。例如,来自我自己的代码:

setup.py

生成文件

3.现代部署工具 有几种新的工具可以部署python应用程序,即
wheels
,它们似乎获得了吸引力。我不使用它,但它看起来可以缓解您的捆绑问题:


一旦安装完成,您可以这样安装:
pip安装一些包。whl

DLL可以与扩展模块位于同一目录中。Python使用
LoadLibraryEx
LOAD\u with\u alternated\u SEARCH\u PATH
加载.pyd扩展名。我正在寻找一种方法,将两个文件合并为1,跳过在搜索路径中使用DLL的需要。不确定,但我认为您可以先使用ctypes.cdll或ctypes.windell加载库,然后它会找到它的实例,例如temp=ctypes.cdll.LoadLibrary('path\u to\u dll')。或者,在pyd中,您可以访问os.environ()以在尝试加载DLL之前更新程序的路径。如果您有其他DLL的源代码,您当然可以创建一个makefile将它们链接在一起。不确定是否有任何包允许您重新链接。这是我正在寻找的重新链接方式:)openCV构建方法正在生成我正在寻找的1文件pyd结果(具有对源代码的访问权限)。对于方法2,我不知道是否可以将Windell作为源。就我而言,我把它们放在图书馆里。对于3号方法,似乎DLL将被分发,但不会合并到最终的pyd中。您有权访问DLL源代码吗?或者你只是链接它,比如user32.dll?只有第一种情况适用于OpenCV的方法。在我的特殊情况下,我确实可以访问源代码,是的,在一个独特的构建项目中一起重建所有东西都可以。然而,我正在寻找一个解决方案,以防无法访问源代码。
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'])])
# 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