我正在尝试使用 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/