如何将 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 构建中的主要内容,如果未能解决你的问题,请参考以下文章
RPi Pyaudio/Portaudio + ALSA:如何选择/更改多路复用器输入