Исполняемый файл PyInstaller в Windows не работает из-за проблем с библиотекой PortAudio (OSError) - PullRequest
3 голосов
/ 08 апреля 2019

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

OSError: библиотека PortAudio не найдена

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

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

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

из ctypes.util import find_library

a = find_library ('portaudio')

печать (а)

Отсутствует

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

Есть идеи?

1 Ответ

1 голос
/ 06 июня 2019

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

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

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

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

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

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

\ your \ path \ to \ python \ Lib \ site-packages_sounddevice_data \ portaudio-binaries

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

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

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

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

...