我正在尝试使用PyInstaller从Python 3.7应用程序在Windows上构建.exe。该构建似乎运行顺利,没有显示任何错误;但是,在Windows命令提示符下执行该文件会导致此严重错误:
OSError:找不到PortAudio库
我已经对这个问题进行了一些研究,并找到了一些信息,但是仍然无法克服。我的应用程序使用sounddevice库,该库取决于PortAudio库。已安装PortAudio,因为当我直接使用Python运行该应用程序时,该应用程序可以完美运行;问题显然是,PyInstaller以某种不同的方式跟踪依赖项,无法找到它并将其链接到构建。
实际上,这种“不同方式”是从“ ctypes.util” Python库调用“ find_library”函数来查找系统上的PortAudio库。因此,我在Python上运行了以下代码,并确认它无法找到该库。
Python 3.7.1(默认值,2018年12月10日,22:54:23)[MSC v.1915 64位(AMD64)] ::> Win32上的Anaconda,Inc. 输入“帮助”,“版权”,“信用”或“许可证”以获取更多信息。
从ctypes.util导入find_library
a = find_library('portaudio')
打印(a)
没有
到目前为止,我已经尝试了几种解决方案。首先,我手动下载并编译了最新的PortAudio版本。没用然后,我尝试使用Anaconda代替正式的Python发行版;如您所知,Anaconda的包管理器“ conda”可以处理PortAudio之类的C库。因此,我将其安装在Anaconda的虚拟环境中,并尝试在其中构建我的应用程序。也没用。我也尝试将PortAudio目录添加到Windows PATH变量,但是也失败了。我有点迷路了。我尚未尝试的唯一想法是使用Wine在Linux上构建它,但是我怀疑可能有一种使其在Windows上运行的方法。
有什么想法吗?
编辑:我自己解决了这个问题。我将发布答案,这可能对某人有用。
我认为是对的。 ctypes检查Windows PATH环境变量中定义的文件夹,并在它们中搜索库。事实是,在Linux上,系统使用某种别名,因此
从ctypes.util导入find_library find_library('portaudio')
它返回正确的portaudio库。但是在Windows上,仅检查文件名。因此,您必须确保满足这两个条件:
关于DLL,如果您在Python应用中使用sounddevice,则应该可以在此处找到它们:
\您的路径\到\ python \ lib \ site-packages_sounddevice_data \ portaudio-binaries
该文件名为“ libportaudio64bit.dll”,因此仅将该目录添加到PATH并不能解决问题。为了克服这个问题,我只是将dll复制到另一个目录,将其重命名为“ portaudio.dll”,然后将该目录添加到PATH中。像魔术一样工作。
如果您不使用声音设备,也可以从此处下载那些相同的预编译DLL:
https://github.com/spatialaudio/portaudio-binaries
仅此而已。希望能帮助到你!
答案 0 :(得分:1)
我设法自己解决了。我将发布答案,这可能对某人有用。
我认为是对的。 ctypes检查Windows PATH环境变量中定义的文件夹,并在它们中搜索库。事实是,在Linux上,系统使用某种别名,因此
from ctypes.util import find_library
find_library('portaudio')
它返回正确的portaudio库。但是在Windows上,仅检查文件名。因此,您必须确保满足这两个条件:
关于DLL,如果您在Python应用中使用sounddevice,则应该可以在此处找到它们:
\您的路径\到\ python \ lib \ site-packages_sounddevice_data \ portaudio-binaries
该文件名为“ libportaudio64bit.dll”,因此仅将该目录添加到PATH并不能解决问题。为了克服这个问题,我只是将dll复制到另一个目录,将其重命名为“ portaudio.dll”,然后将该目录添加到PATH中。像魔术一样工作。
如果您不使用声音设备,也可以从此处下载那些相同的预编译DLL:
https://github.com/spatialaudio/portaudio-binaries
仅此而已。希望能帮助到你!
答案 1 :(得分:0)
由于选择的答案对我不起作用,因为我使用的是virtualenv,所以将工作解决方案放在这里。
对我来说,可行的解决方案是在.exe文件所在的位置添加 _sounddevice_data 文件夹,然后在其中创建一个 portaudio-binaries 文件夹,最后将最新创建的文件夹中的libportaudio64bit.dll 。
希望有帮助!