我正在使用Cython构建一个连接到DLL文件的Python模块。要成功导入我的模块,我需要在Windows搜索路径中有该DLL。否则,通常会出现以下错误消息:
ImportError: DLL load failed: 找不到指定的模块。
是否有一种方法可以将DLL直接打包到生成的pyd文件中,以便使分发变得更加容易?
一个这样的示例是OpenCV发行版,其中分发了一个(巨大的)pyd文件,这是Python绑定所需的唯一文件。
Python的打包和部署对我们许多人来说仍然是个痛点。并没有一种万能解决方案。以下是几种方法:
OpenCV使用位于modules/python/src2的一些Python脚本自动生成这些包装函数,从C++头文件中解析所需的
static PyObject
关键字。
基本上,它会解析头文件并生成static PyObject
关键字,每当需要时就会生成。一旦适当地创建了头文件,它只需调用python setup
即可。老实说,这种方法可能有效,但我不建议使用。
如果您已经使用Makefile,请创建一个规则以相应地放置您的库。例如,从我的代码中:
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
现在有几种新的部署 Python 应用程序的工具,即 wheels
,看起来越来越受欢迎。虽然我不使用它,但它似乎可以解决您的捆绑问题:
一旦它被 wheeled
,您可以像这样安装它:pip install some-package.whl
LoadLibraryEx
和LOAD_WITH_ALTERED_SEARCH_PATH
来加载.pyd
扩展。 - Eryk Sun