anijackich
@anijackich

Почему приложение, собранное с помощью Pyinstaller, не находит добавленный в сборку исполняемый файл?

Я делаю сборку python приложения, использующего внешний исполняемый файл, с помощью Pyinstaller:
pyinstaller --onefile -i NONE --add-binary "./ffmpeg.exe;." ./myapp.py

В myapp.py вызывается ffmpeg.exe так:
subprocess.Popen(("./ffmpeg.exe", …))
Однако при запуске сборки появляется ошибка:
FileNotFoundError: [WinError 2] Не удается найти указанный файл

Pyinstaller как будто и не добавляет в сборку ffmpeg.exe, однако это не так — размер такой сборки больше
  • Вопрос задан
  • 213 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
subprocess.Popen(("./ffmpeg.exe", …))
Ты просишь запустить файл ffmpeg.exe, находящийся в текущем каталоге. Текущий каталог может и не совпадать с каталогом, в который pyinstaller распаковал твоё приложение. Почитай, что такое относительный и абсолютный путь.

Чтобы получить этот каталог, попробуй такой приём из документации:
import sys
from pathlib import Path

if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):  # мы запакованы pyinstaller?
    TEMP_DIR = Path(sys._MEIPASS).resolve()  # да - берем каталог приложения
else:  # нет, мы не запакованы
    TEMP_DIR = Path(sys.argv[0]).parent.resolve()  # берем просто каталог скрипта
# resolve() делает путь абсолютным, так что при смене текущего каталога путь не сломается
ffmpeg_path = str(TEMP_DIR / "ffmpeg.exe")  # предполагаю, что ffmpeg лежит не в подкаталоге
ffmpeg = subprocess.Popen((ffmpeg_path, …))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы