我正在使用Cython构建一个链接DLL文件的python模块。为了成功导入我的模块,我需要在Windows搜索路径中使用DLL。否则,典型的错误消息是:
ImportError: DLL load failed: The specified module could not be found.
有没有办法将DLL直接打包到生成的pyd文件中以使分发更容易?
这方面的一个例子是OpenCV发行版,其中分发了一个(巨大的)pyd文件,它是Python绑定工作所需的唯一文件。
答案 0 :(得分:9)
Python的包装&部署仍然是我们许多人的痛点。没有银弹。以下是几种方法:
OpenCV从C ++自动生成这些包装函数 标题使用位于的一些Python脚本 模块/蟒/ SRC2。
基本上它会解析头文件并在需要时生成static PyObject
个关键字。正确创建标头后,只需调用python setup
即可。老实说,它可能会奏效,但我不会建议这种方法。
如果您已经使用了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'])])
生成文件
# 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