由于 PortAudio 库问题 (OSError),Windows 上的 PyInstaller 可执行文件无法运行

PyInstaller executable on Windows not working because of PortAudio library issues (OSError)

我正在尝试使用 PyInstaller 从我的 Python 3.7 应用程序在 Windows 上构建一个 .exe。构建看起来 运行 顺利并且没有显示错误;然而,在 Windows 命令提示符下执行文件会导致这个可怕的错误:

OSError: PortAudio library not found

我已经对这个问题做了一些研究并找到了一些信息,但仍然无法克服它。我的应用程序使用 sounddevice 库,它依赖于 PortAudio 库。 PortAudio 已安装,因为当我 运行 直接使用 Python 时,该应用程序运行良好;很明显,问题是 PyInstaller 以某种不同的方式跟踪依赖关系并且无法找到它并且 link 它到构建。

这个'different way'实际上是调用'ctypes.util'Python库中的'find_library'函数来查找系统上的PortAudio库。因此,我 运行 Python 上的以下内容并确认它无法找到该库。

Python 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)] :: > Anaconda, Inc. on win32 Type "help", "copyright", "credits" or "license" for more information.

from ctypes.util import find_library

a = find_library('portaudio')

print(a)

None

到目前为止,我已经尝试了几种解决方案。首先,我手动下载并编译了最新的 PortAudio 版本。没用。然后,我尝试使用 Anaconda 而不是官方 Python 发行版;如您所知,Anaconda 的包管理器 'conda' 可以处理像 PortAudio 这样的 C 库。所以我将它安装在我的 Anaconda 虚拟环境中并尝试在其中构建我的应用程序。也没用。我也尝试将 PortAudio 目录添加到 Windows PATH 变量,但它也失败了。我有点迷路了。我尚未尝试的唯一想法是使用 Wine 在 Linux 上构建它,但我怀疑可能有一种方法可以让它在 Windows 上运行。

有什么想法吗?

我自己设法解决了。我会 post 回答,它可能对某些人有用。

我想的是对的。 ctypes 检查 Windows PATH 环境变量中定义的文件夹并在其中搜索库。事情是,在 Linux 系统使用某种别名,所以当

from ctypes.util import find_library
find_library('portaudio')

它 returns 正确的 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

就是这样。希望能帮助到你!

由于所选答案对我不起作用,因为我使用的是 virtualenv,所以我将我的工作解决方案放在这里。

对我来说,可行的解决方案是添加 .exe 文件所在的 _sounddevice_data 文件夹,然后制作一个 portaudio-binaries 文件夹,最后将 libportaudio64bit.dll 放入最近创建的文件夹中。

希望对您有所帮助!