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

标签 python-3.x windows pyinstaller portaudio

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

OSError: PortAudio library not found

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

实际上,这种“不同的方式”是从“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 上运行。

有什么想法吗?

最佳答案

我设法自己解决了。我会发布答案,它可能对某人有用。

我的想法是对的。 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

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

关于python-3.x - 由于 PortAudio 库问题 (OSError),Windows 上的 PyInstaller 可执行文件无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55566430/

相关文章:

python-3.x - Python - 请求、lxml 和 xpath 不起作用

python-3.x - Pandas 使用 Pivot 转置

windows - 是否有人使用 libgit2、libgit2sharp、Ngit 来替代 msysgit 的 Windows?

windows - 为什么默认的 Windows WebDAV 客户端会忽略 403 Forbidden 响应?

python - 如何构建一个独立的Scrapy Spider?

python - 名称 'slugify' 未定义

python - 如何使用 python3 pickle 读取 python2 cPikle 的序列化数据?

linux - 在专用服务器上安装Windows Server

python - Pyinstaller: AttributeError: 模块 'enum' 没有属性 'IntFlag'

linux - 如何部分编译 python 文件?