我正在尝试使用PyInstaller从Python 3.7应用程序在Windows上构建.exe。该构建似乎运行顺利,没有显示任何错误;但是,在Windows命令提示符下执行文件会导致以下可怕错误:
我已经对该问题进行了一些研究并找到了一些信息,但仍然无法克服。我的应用程序使用sounddevice库,该库取决于PortAudio库。已安装PortAudio,因为当我直接使用Python运行该应用程序时,该应用程序可以完美运行;问题显然是,PyInstaller以某种不同的方式跟踪依赖项,无法找到它并将其链接到构建。
实际上,这种“不同方式”是从“ctypes.util” Python库调用“find_library”函数来查找系统上的PortAudio库。因此,我在Python上运行了以下命令,并确认它无法找到该库。
到目前为止,我已经尝试了几种解决方案。首先,我手动下载并编译了最新的PortAudio版本。没用然后,我尝试使用Anaconda代替正式的Python发行版;如您所知,Anaconda的包管理器“conda”可以处理PortAudio之类的C库。因此,我将其安装在Anaconda的虚拟环境中,并尝试在其中构建我的应用程序。也没用。我也尝试将PortAudio目录添加到Windows PATH变量,但是也失败了。我有点迷路了。我尚未尝试的唯一想法是使用Wine在Linux上构建它,但是我怀疑可能有一种使其在Windows上运行的方法。
有任何想法吗?
最佳答案
我设法自己解决了。我将发布答案,这可能对某人有用。
我认为是对的。 ctypes检查Windows PATH环境变量中定义的文件夹,并在它们中搜索库。事实是,在Linux上,系统使用某种别名,因此当
from ctypes.util import find_library
find_library('portaudio')
它返回正确的portaudio库。但是在Windows上,仅检查文件名。因此,您必须确保满足以下两个条件:
关于DLL,如果您在Python应用中使用sounddevice,则应该可以在这里找到它们:
该文件名为“libportaudio64bit.dll”,因此仅将该目录添加到PATH并不能解决问题。为了克服这个问题,我只是将dll复制到另一个目录,将其重命名为“portaudio.dll”,然后将该目录添加到PATH中。像魔术一样工作。
如果您不使用声音设备,还可以从此处下载这些相同的预编译DLL:
https://github.com/spatialaudio/portaudio-binaries
就这样。希望能帮助到你!
关于python-3.x - Windows上的PyInstaller可执行文件由于PortAudio库问题而无法运行(OSError),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55566430/