Мое (первое) веб-приложение использует pydub, который зависит от ffmpeg. В моей локальной среде Windows я установил ffmpeg и добавил путь к исполняемым файлам ffmpeg в переменные среды Windows «путь».
Все это работает локально, но поклон, что я развернул свое приложение на PythonAnywhere, следующая строка в моем коде вызывает ошибку:
sound.export(export_path, format = "mp3", bitrate = "128k")
Я считаю, что ошибка связана с тем, что этот код использует ffmpeg.
Я читал на их форумах, что ffmpeg установлен для всех пользователей PythonAnywhere. Есть ли что-то, что мне нужно сделать, чтобы заставить его работать? Нужно ли добавлять путь к файлам ffmpeg в переменные среды? У меня есть файл .env с другими переменными env — нужно ли мне что-то добавить к нему?
Я установил пакет и добавил использование в свой views.py, но все равно получаю ту же ошибку. Может я что-то не так сделал?
Насколько я знаю, пакет не добавляет автоматически свои двоичные файлы ffmpeg в системный путь, когда вы используете его в программе Python. Существует недокументированная функция static_ffmpeg.add_paths(), которая загружает и добавляет двоичные файлы в путь. (Похоже, что владелец недавно добавил пакет.) Я настоятельно рекомендую просмотреть код в пакете (не большой репозиторий), чтобы лучше понять его самостоятельно.
Я добавил «import static_ffmpeg», а затем «static_ffmpeg.add_paths()» в views.py, но, похоже, это ничего не изменило.
Когда я набираю «ffmpeg» в терминале PythonAnywhere, я получаю информацию о версии и конфигурации, поэтому кажется, что он установлен. Должно быть что-то еще, что мне нужно сделать, чтобы мой код правильно его использовал. Как уже упоминалось, он работал локально в Windows, где я установил ffmpeg и добавил его в переменную среды path. Я понятия не имею, как это сделать на PythonAnywhere.
Я не знаю, как работает PythonAnywhere, но вы можете попробовать напечатать os.environ['PATH'] в своей программе Python и сравнить его с $PATH в терминале, чтобы проверить, включен ли каталог ffmpeg в оба. (Я не могу сказать вам, что делать, если нет... но, по крайней мере, вы знаете, что делать дальше)
Когда я печатаю os.environ['PATH'] из своего приложения, я получаю "/home/gridsquid/.local/bin:/usr/local/bin:/usr/bin:/bin". Когда я ввожу «$PATH» в терминал, я получаю: «bash: /home/gridsquid/.virtualenvs/myvirtualenv/bin:/home/gridsquid/.local/bin:/usr/local/julia- 1.6.1/bin:/usr/lib/postgresql/12/bin/:/home/gridsquid/.local/bin:/usr/local/julia-1.6.1/bin :/usr/lib/postgresql/12/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin: Нет такой файл или каталог». Я не уверен, что делать с этой информацией (извините, нуб здесь).
Кроме того, я получил этот ответ от PythonAnywhere: «Он установлен для всех пользователей и находится в пути». Итак, почему мой код не работает здесь, если он работает локально?
о, хорошо, значит, сервис поддерживает ffmpeg по умолчанию. мой плохой, я не предполагал, что. os.system('ffmpeg') работает?






Вернулся домой и сам попробовал PythonAnywhere, и я не обнаружил никаких проблем с ним и его FFmpeg.
Ничего не устанавливая (ни FFmpeg, ни пакетов Python), я успешно запускаю REPL:
>>> os.system('ffmpeg')
[snipped ffmpeg banner]
>>> import pydub
>>> pydub.utils.get_encoder_name()
'ffmpeg'
>>> pydub.utils.get_prober_name()
'ffprobe'
>>> pydub.utils.get_supported_codecs()
[snipped a large list of FFmpeg codecs]
Итак, ваша проблема не в ffmpeg/pydub. Напишите точную ошибку. Может быть, вам не нравится сохранять файл в указанную вами директорию?
Ты прав. Я добавил более подробную информацию к моему решению ниже. Спасибо.
Проблема была не в ffmpeg, который, как я подтвердил, установлен для всех пользователей PythonAnywhere. Вместо этого моя проблема заключалась в пути экспорта, который я использовал с pydub. Я исправил свою проблему, изменив:
export_path = "media/my_path"
к
export_path = "home/my_app/my_app/media/my_path"
который затем используется в
sound.export(export_path, format = "mp3", bitrate = "128k")
Вы можете попробовать включить пакет static-ffmpeg в свой venv. Этот пакет загружает двоичные файлы ffmpeg в папку venv
site-packages. Итак, я подозреваю, что это будет работать на PythonAnywhere.