Исполняемый файл PyInstaller в Windows не работает из-за проблем с библиотекой PortAudio (ошибка операционной системы)

#python-3.x #windows #pyinstaller #portaudio

#python-3.x #Windows #pyinstaller #portaudio

Вопрос:

Я пытаюсь создать .exe в Windows из моего приложения на Python 3.7 с помощью PyInstaller. Кажется, что сборка выполняется гладко и не показывает ошибок; однако выполнение файла в командной строке Windows приводит к этой ужасной ошибке:

Ошибка операционной системы: библиотека PortAudio не найдена

Я провел некоторые исследования по этой проблеме и нашел некоторую информацию, но все еще не смог ее преодолеть. Мое приложение использует библиотеку sounddevice, которая зависит от библиотеки PortAudio. PortAudio установлен, поскольку приложение отлично работает, когда я запускаю его напрямую, используя Python; проблема, очевидно, в том, что PyInstaller отслеживает зависимости каким-то другим способом и не может найти его и связать со сборкой.

Этот «другой способ», на самом деле, вызывает функцию ‘find_library’ из библиотеки ‘ctypes.util’ Python, чтобы найти библиотеку PortAudio в системе. Итак, я запустил следующее на Python и подтвердил, что он не может найти библиотеку.

Python 3.7.1 (по умолчанию, дек 10 2018, 22:54:23) [ MSC v.1915 64-разрядная версия (AMD64)] :: > Anaconda, Inc. в win32 Введите «справка», «авторское право», «кредиты» или «лицензия» для получения дополнительной информации.

из ctypes.util импортируйте find_library

a = find_library(‘portaudio’)

печать (a)

Нет

До сих пор я пробовал несколько решений. Сначала я загрузил и скомпилировал последнюю версию PortAudio вручную. Не сработало. Затем я попытался использовать Anaconda вместо официального дистрибутива Python; как вы, возможно, знаете, менеджер пакетов Anaconda ‘conda’ может работать с библиотеками C, такими как PortAudio. Итак, я установил его в виртуальной среде моей Anaconda и попытался создать там свое приложение. Тоже не сработало. Я также попытался добавить каталог PortAudio в переменную Windows PATH, но это также не удалось. Я немного потерялся. Единственная идея, которую мне еще предстоит попробовать, — это создать его в Linux с использованием Wine, но я подозреваю, что может быть способ заставить его работать в Windows.

Есть идеи?

Ответ №1:

Мне удалось решить это самостоятельно. Я опубликую ответ, он может быть кому-нибудь полезен.

То, что я считал правильным. ctypes проверяет папки, определенные в переменной среды Windows PATH, и выполняет поиск в них библиотек. Дело в том, что в Linux система использует какой-то псевдоним, поэтому, когда

 from ctypes.util import find_library
find_library('portaudio')
  

он возвращает правильную библиотеку portaudio. Но в Windows проверяются только имена файлов. Итак, вы должны убедиться, что эти два условия выполнены:

  • Каталог, содержащий библиотеки DLL PortAudio, находится в вашей переменной окружения PATH.
  • Имя файла DLL (без расширения) должно быть точно «portaudio».

Что касается библиотек DLL, если вы использовали sounddevice в своем приложении на Python, вы должны быть в состоянии найти их здесь:

yourpathtopythonLibsite-packages_sounddevice_dataportaudio-двоичные файлы

Файл называется ‘libportaudio64bit.dll ‘, поэтому простое добавление этого каталога в PATH не поможет. Чтобы преодолеть это, я просто скопировал dll в другой каталог, переименовав его в ‘portaudio.dll’ и добавил этот каталог в PATH. Сработало как по волшебству.

Если вы не используете sounddevice, вы также можете загрузить те же самые предварительно скомпилированные библиотеки DLL отсюда:

https://github.com/spatialaudio/portaudio-binaries

Вот и все. Надеюсь, это поможет!

Ответ №2:

Поскольку выбранный ответ у меня не сработал, потому что я использую virtualenv, я разместил свое рабочее решение здесь.

Для меня рабочее решение — добавить папку _sounddevice_data, в которой находится exe-файл, затем создать в ней папку portaudio-binaries и, наконец, поместить libportaudio64bit.dll в недавно созданной папке.

Надеюсь, это поможет!