Попытка преобразовать скрипты Python в exe с помощью PyInstaller.
В своем коде я использую ffmpeg-python:
import ffmpeg
....
def ffmpeg_save_clip(self,output_video: str, clip_start: str, clip_end: str):
(ffmpeg
.input(self.file.get_videopath(), )
.output(output_video, vcodec='copy', ss=clip_start, to=clip_end, acodec='copy')
.global_args('-y')
.run())
Итак, я вызываю PyInstaller из терминала с соответствующим флагом:
pyinstaller --windowed --hidden-import "ffmpeg-python" --noconsole --icon=app.ico --name "app" main.py
Я также проверил:
pip install ffmpeg-python
Requirement already satisfied: ffmpeg-python in c:\python38\lib\site-packages (0.2.0)
Requirement already satisfied: future in c:\python38\lib\site-packages (from ffmpeg-python) (0.18.3)
Но я получаю от PyInstaller:
Hidden import 'ffmpeg-python' not found
Приложение работает в визуальной студии, но когда я запускаю pyinstaller exe и пытаюсь сохранить клип, оно зависает без ответа.
Примечание: я также:
попробуйте добавить ffmpeg.exe в корневую папку приложения pyinstaller.
попробуйте использовать файл .spec с:
binaries=[('C:\\ffmpeg\\bin\\ffmpeg.exe', 'ffmpeg/),('C:\\ffmpeg\\bin\\ffplay.exe','ffplay/'), ('C:\\ffmpeg\\bin\\ffprobe.exe', 'ffprobe/')]
,
Ничего не меняется
ОБНОВЛЯТЬ Танк, @happy_code_egg, ты объяснил мне такие вещи. Я попробовал то, что вы сказали, и у меня больше нет ошибок.
Но я не могу заставить работать ffmpeg в Pyinstaller exe. Я добавил блок try/кроме, чтобы изолировать проблему. (когда я запускаю приложение в Visualstudio, оно работает, но не при использовании exe).
блок (очень похож на прошлый def):
def ffmpeg_save_clip(self,output_video: str, clip_start: str, clip_end: str):
input = 'C:\Users\x\Desktop\input.mp4'
output = 'C:\Users\x\Desktop\output.mp4'
try:
(ffmpeg
.input(input)
.output(output, vcodec='copy', ss=clip_start, to=clip_end, acodec='copy')
.global_args('-y')
.run(capture_stdout=True))
except Exception as e:
self.logger.error('Video window -> ffmpeg_save_clip -> error ' + str(e))
self.logger.error('Video window -> ffmpeg_save_clip -> input file: ' + input)
self.logger.error('Video window -> ffmpeg_save_clip -> output file ' + output)
raise ValueError(str(e))
Примечание: (фиксированные входные и выходные данные приведены только в качестве простых примеров пути)
Когда я открываю журнал, у меня есть:
2024-08-09 11:28:50,293 - ERROR - Video window -> ffmpeg_save_clip -> error [WinError 2] File not found error
2024-08-09 11:28:50,293 - ERROR - Video window -> ffmpeg_save_clip -> input file: C:\Users\x\Desktop\input.mp4
2024-08-09 11:28:50,293 - ERROR - Video window -> ffmpeg_save_clip -> output file C:\Users\x\Desktop\ouput.mp4
(Я пробовал использовать '/', а также '\', чтобы создать путь) Пути к файлам верны, и в Visualstudio они могут быть обработаны с помощью ffmpeg (без ошибок), но exe-файл, похоже, не находит (ввод или вывод)
Я попробовал решение, описанное здесь: Python ffmpeg не принимает путь (без эффектов)
Я нашел также эти обсуждения:
в обоих обсуждениях возникает проблема с сосуществованием библиотек ffmpeg + ffmpeg-python.
Я попытался (как уже было сказано) удалить оба и переустановить ffmpeg-python, но ничего не меняется.
Примечание: У меня также есть три других предупреждения во время Pyinstaller: (Я пишу их только для полного контекста, но думаю, что они не имеют никакого влияния на эту проблему.)
57283 ERROR: Hidden import 'fiona._shim' not found
57298 WARNING: Hidden import "fiona._shim" not found!
57392 WARNING: Hidden import "importlib_resources.trees" not found!
пробовал с:
--hidden-import fiona._shim --hidden-import fiona.schema
пробовал также с:
--add-data = "fiona/*;fiona”
но предупреждения все равно остаются.
PyInstaller не упаковал модуль ffmpeg-python
, а не ffmpeg.exe
.
Сначала перейдите c:\python38\lib\site-packages
и скопируйте папку пакета ffmpeg
.
Затем вставьте папку пакета ffmpeg
в корневой каталог вашего проекта.
Наконец, соберите exe. Какой бы ни была ваша команда, вам следует использовать команду --add-data
, чтобы добавить папку пакета ffmpeg
при сборке exe.
В вашем случае используйте эту команду.
pyinstaller --add-data = "ffmpeg/*;ffmpeg" --windowed --noconsole --icon=app.ico --name "app" main.py
--add-data = "ffmpeg/*;ffmpeg"
это означает добавление всех файлов и подпапок внутри папки ffmpeg
в папку ffmpeg
, созданную внутри папки exe или приложения.
Это должно решить проблему. Если другие модули не найдены, выполните те же действия для их упаковки.
Кстати, вы также можете напрямую скопировать и вставить папку ffmpeg
в корневую папку приложения pyinstaller. В этом случае вам не нужно использовать команду --add-data
.
Что касается обновленной части, если путь ввода и вывода верны на 100%, то File not found error
не имеет к ним никакого отношения. Ошибка сообщает вам, что exe не смог найти ffmpeg.exe
. Добавлен ли ffmpeg.exe
в путь среды? Вы также можете попробовать поместить его в папку приложения. Кстати, не обращайте внимания на предупреждения, они не имеют никакого влияния. Кроме того, всегда используйте / или \\ в Windows.
Для тех, кто сталкивался с этой проблемой, я наконец нашел способ заставить ее работать. Спасибо за поддержку @happy_code_egg (и это объясняет возможности)
Чтобы решить проблему ffmpeg-python, включая pyinstaller, следуйте тому, что сказал @happy_code_egg.
В любом случае (как я писал в разделе обновления моего вопроса), проблема все равно оставалась: используя команду Python ffmpeg в pyinstaller.exe, я имел:
error [WinError 2] The system cannot find the file specified
Это была ссылка не на видеофайл, а на сам ffmpeg.exe. (приложение не смогло найти ffmpeg.exe) Как сказал @happy_code_egg в комментарии.
чтобы это работало, вы можете использовать флаг ffmpeg, чтобы найти ffmpeg.exe:
(ffmpeg ...
...
.run(overwrite_output=True, cmd=r'c:\FFmpeg\bin\ffmpeg.exe')
Добавление флага cmd работает!
Чтобы избежать установки ffmpeg на главный компьютер (каждый главный компьютер, который будет использовать pyinstallar.exe), поместите ffmpeg.exe в корневой каталог основного скрипта Python и установите:
rel_ffmpeg_path = os.path.dirname(__file__) + '\\ffmpeg.exe'
...
(ffmpeg ...
...
.run(overwrite_output=True, cmd=rel_ffmpeg_path)
Надеюсь, это поможет.
Спасибо, @happy_code_egg, ты решил мою половину проблемы. См. обновленную информацию по вопросу, чтобы узнать, что произошло.