我正在尝试使用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)] ::> Anaconda,Inc.在win32上键入“ help”,“ copyright”,“ credits”或有关更多信息的“许可证”。
从ctypes.util导入find_library
一个= find_library('portaudio')
打印(a)
没有
到目前为止,我已经尝试了几种解决方案。首先,我手动下载并编译了最新的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,则应该可以在这里找到它们:
\ your \ path \ to \ python \ Lib \ site-packages_sounddevice_data \ portaudio-binaries
该文件名为“ libportaudio64bit.dll”,因此仅将该目录添加到PATH并不能解决问题。为了克服这个问题,我只是将dll复制到另一个目录,将其重命名为“ portaudio.dll”,然后将该目录添加到PATH中。像魔术一样工作。
如果您不使用声音设备,也可以从此处下载这些相同的预编译DLL:
https://github.com/spatialaudio/portaudio-binaries
就这样。希望能帮助到你!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句