Windows中PyInstaller可执行文件无法工作,因为存在PortAudio库问题(OSError)

4
我正在尝试使用PyInstaller从我的Python 3.7应用程序在Windows上构建.exe文件。构建过程似乎顺利完成,并且没有显示任何错误; 但是,在Windows命令提示符上执行该文件会导致以下糟糕的错误:
OSError: 没有找到PortAudio库
我已经对此问题进行了一些研究并找到了一些信息,但仍然无法解决它。我的应用程序使用sounddevice库,它依赖于PortAudio库。由于当我直接使用Python运行它时,PortAudio被安装了,因此该应用程序可以完美地工作; 显然,问题在于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. On win32 键入“help”,“copyright”,“credits”或“license”以获取更多信息。 from ctypes.util import find_library a = find_library('portaudio') print(a) None 到目前为止,我已经尝试了几种解决方案。首先,我手动下载并编译了最新的PortAudio版本。不管用。然后,我尝试使用Anaconda而不是官方的Python发行版; 正如您可能已经知道的那样,Anaconda的软件包管理器“conda”可以处理像PortAudio这样的C库。因此,我在我的Anaconda虚拟环境中安装了它,并尝试在其中构建我的应用程序。也没有成功。我还尝试将PortAudio目录添加到Windows PATH变量中,但它也失败了。我有点失落。我唯一尚未尝试的想法是在Linux上使用Wine进行构建,但我怀疑可能有方法使其在Windows上工作。
您有任何想法吗?
2个回答

2
我自己解决了这个问题。我会发布答案,也许对某些人有用。
我认为的是正确的。ctypes检查Windows PATH环境变量中定义的文件夹,并在其中搜索库。问题是,在Linux上,系统使用某种别名,因此当...
from ctypes.util import find_library
find_library('portaudio')

它会返回正确的portaudio库。但是在Windows上,只有文件名被检查。因此,您必须确保满足以下两个条件:
  • 包含PortAudio DLL的目录已在PATH环境变量中。
  • DLL文件名(不带扩展名)必须完全为“portaudio”。
关于DLL,如果您在Python应用程序中使用sounddevice,则应该能够在此处找到它们:

\your\path\to\python\Lib\site-packages_sounddevice_data\portaudio-binaries

该文件名为“libportaudio64bit.dll”,因此仅将该目录添加到PATH并不能解决问题。为了克服这一问题,我将dll复制到另一个目录中,将其重命名为“portaudio.dll”,然后将该目录添加到PATH。像魔术一样奏效。
如果您没有使用sounddevice,也可以从此处下载相同的预编译DLL:

https://github.com/spatialaudio/portaudio-binaries

这就是全部了。希望能有所帮助!

0
由于选择的答案对我不起作用,因为我正在使用virtualenv,所以我在这里提供我的解决方案。
对我来说,有效的解决方案是在.exe文件所在的位置添加_sounddevice_data文件夹,然后在其中创建一个portaudio-binaries文件夹,并最后将libportaudio64bit.dll放入新创建的文件夹中。
希望能对您有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接