#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 в недавно созданной папке.
Надеюсь, это поможет!