如何将 PortAudio 包含到 pyinstaller onefile 构建中

Posted

技术标签:

【中文标题】如何将 PortAudio 包含到 pyinstaller onefile 构建中【英文标题】:How to include PortAudio into a pyinstaller onefile build 【发布时间】:2021-12-17 01:30:59 【问题描述】:

我在 Ubuntu 上运行的项目中使用 sounddevice - 当我使用 pyinstaller 构建单个文件时失败(运行源 python 文件时代码运行良好):

Traceback (most recent call last):
  File "Run_SD.py", line 2, in <module>
  File "Smart_Device.py", line 26, in init Smart_Device
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller/loader/pyimod03_importers.py", line 540, in exec_module
  File "sounddevice.py", line 71, in <module>
OSError: PortAudio library not found
[213] Failed to execute script Run_SD

不幸的是,我不能简单地在机器上安装所需的 portaudio,所以它需要包含在包中。我尝试使用以下方法添加库:

--add-binary libportaudio.so:.  --add-binary libportaudio.a:.

但这不起作用。我猜我需要将 portaudio 库实际导入到我的 python 源中——对吗?有关如何执行此操作的任何指示?

【问题讨论】:

总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。 您阅读过pyinstaller 文档吗?有一些信息如何解决一些问题。 也许你应该使用/full/path/to/libportaudio.so 我更新了完整的错误信息。我不需要 libportaudio.so 的完整路径,因为它就在源目录中(之前已复制),因此添加它没有问题。 我只是猜测 - 也许pyinstaller 在不同的文件夹中运行,它需要完整的路径才能找到它。这是最常见的问题。其他想法 - pyinstaller 应该创建文件 .spec,您可以使用它来添加模块/库/资源,也许您可​​以在文档中找到如何正确使用它。 【参考方案1】:

我通过编辑解决了这个问题:

versions/3.8.5/lib/python3.8/site-packages/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-sounddevice.py

elif is_linux:
    path = os.path.join(
        sfp[0], "_sounddevice_data", "portaudio-binaries", "libportaudio.so"
    )

versions/3.8.5/lib/python3.8/site-packages/sounddevice.py

    elif _platform.system() == 'Linux':
        _libname = 'libportaudio.so'

然后在 pyinstaller 构建中包含 libportaudio.so:

--add-binary _sounddevice_data/portaudio-binaries/libportaudio.so:./_sounddevice_data/portaudio-binaries/

【讨论】:

以上是关于如何将 PortAudio 包含到 pyinstaller onefile 构建中的主要内容,如果未能解决你的问题,请参考以下文章

如何最大限度地提高实时处理性能(Portaudio)

让 dll 包含在 Visual Studio 中工作

RPi Pyaudio/Portaudio + ALSA:如何选择/更改多路复用器输入

如何解决Linux系统下pyaudio安装缺少文件问题error: portaudio.h: 没有那个文件或目录

等到播放完成

PortAudio:如何从麦克风获取记录(获取数据)