当我使用pyinstaller制作.exe文件时,“由于冻结应用程序时找不到dynlib / dll”,因为pylibmtx发生了错误

时间:2019-01-09 12:46:30

标签: python-3.x pyinstaller

enter image description here

当我enter image description here

我正在努力制作.exe文件。 错误消息显示它在9号行有问题,所以我检查了我的代码。有导入的库“ pylibdmtx”用于解码数据矩阵。

所以我尝试删除所有与其他相关属性有关的库,然后就可以了。 我试图找出该问题以进行故障排除,但找不到。所以我终于向你问了我的问题。

我上传了我的问题的记录

谢谢。

3 个答案:

答案 0 :(得分:2)

也许来晚了,但是如果其他人对此有疑问,我将分享此信息:

找到了here

在引导加载程序中,我们使用提取路径调用SetDllDirectory。由于某种原因,这似乎阻止了从当前目录加载dll。 如果使用Null参数调用SetDllDirectory以重置dll搜索路径,则可以从当前目录加载dll。

基于vlc和libvlc.dll的示例。

不起作用:

import ctypes
import os

os.chdir('C:\\Program Files\\VideoLan\\VLC\\')
print(ctypes.CDLL('libvlc.dll'))

作品:

import ctypes
import os

ctypes.windll.kernel32.SetDllDirectoryW(None)

os.chdir('C:\\Program Files\\VideoLan\\VLC\\')
print(ctypes.CDLL('libvlc.dll'))

因此,如果您的代码加载具有ctypes的外部DLL文件,请确保在加载DLL之前添加此行(在Windows下测试,不确定其他操作系统)

ctypes.windll.kernel32.SetDllDirectoryW(None)

答案 1 :(得分:0)

诸如pyinstaller和cx_Freeze之类的冻结器无法找到使用ctypes加载的库。 pylibdmtx在pylibdmtx.EXTERNAL_DEPENDENCIESctypes.CDLL实例列表)中公开了这些二进制依赖性。您可以使用pyinstaller规范文件(example)使pyinstaller将其包含在冻结中。

答案 2 :(得分:0)

在使用 Pyinstaller 创建可执行文件时,您可能必须明确包含所需的 DLL 文件。假设所需的 DLL 文件为 xyz.dll,python 脚本为 myscript.py,您可以像这样包含 DLL:

> pyinstaller --add-binary xzy.dll;. --onefile myscript.py

这会将 DLL 放在创建的可执行文件中的基本路径中