【问题标题】:PyInstaller executable on Windows not working because of PortAudio library issues (OSError)由于 PortAudio 库问题 (OSError),Windows 上的 PyInstaller 可执行文件无法运行
【发布时间】:2019-08-29 04:33:21
【问题描述】:

我正在尝试使用 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. on win32 输入“help”、“copyright”、“credits”或“license”了解更多信息。

从 ctypes.util 导入 find_library

a = find_library('portaudio')

打印(一)

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

有什么想法吗?

【问题讨论】:

    标签: python-3.x windows pyinstaller portaudio


    【解决方案1】:

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

    我认为是对的。 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

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

    【讨论】:

      【解决方案2】:

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

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

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2018-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多