PyDub OSError: [WinError 6] Дескриптор недействителен

У меня аналогичная проблема на Python 3.8.7, и я не могу найти решение.

В своем проекте я использую pydub.AudioSegment для получения звука из файла, а затем экспортирую этот звук в другой формат. Мой код отлично работает, когда я запускаю файл python напрямую. Однако, когда я конвертирую его в исполняемый файл с помощью pyinstaller, запускаю программу и дохожу до импорта звука с помощью pydub, это дает мне следующую ошибку:

Traceback (most recent call last):
  File "main.py", line 269, in <module>
  File "main.py", line 213, in convertfile
  File "main.py", line 133, in cloud_upload
  File "pydub\audio_segment.py", line 728, in from_file
  File "pydub\utils.py", line 274, in mediainfo_json
  File "subprocess.py", line 804, in __init__
  File "subprocess.py", line 1142, in _get_handles
OSError: [WinError 6] The handle is invalid

Вызов pydub в моей программе выглядит так:

sound = AudioSegment.from_file(filepath)
sound.export(new_filepath, format="ogg",codec='libopus')

Я пытался добавить stdin = subprocess.DEVNULL и stdin = subprocess.PIPE в utils.py в строке 274, но это тоже не сработало. Возможно, я добавил их неправильно, поэтому такие предложения также приветствуются.


person SevaOle    schedule 11.04.2021    source источник
comment
Я предполагаю, что ему есть чем заняться всякий раз, когда метод export пытается вызвать ffmpeg через subprocess. Можете ли вы вручную добавить shell=True в эту строку: github.com/ jiaaro / pydub / blob / master / pydub / audio_segment.py # L963   -  person Dimitar    schedule 11.04.2021
comment
@Dimitar, спасибо за быстрый ответ! Я сделал это, но, к сожалению, получаю ту же ошибку.   -  person SevaOle    schedule 11.04.2021
comment
Я не знаю, связано ли это с этим, но также у меня нет ffmpeg в моем PATH. У меня есть файлы ffmpeg.exe, ffplay.exe и ffprobe.exe в моем корневом каталоге вместе с основным скриптом. Я также добавляю эти exe-файлы в свою программу в pyinstaller с помощью --add-data.   -  person SevaOle    schedule 11.04.2021
comment
Это тоже может быть причиной, не могли бы вы добавить их в свой PATH и попробовать еще раз? Также убедитесь, что они есть, вызывая их заранее и не добавляйте их с помощью --add-data   -  person Dimitar    schedule 11.04.2021
comment
Я просто попробовал самостоятельно и не вижу никаких проблем. У меня ffmpeg на моем пути, единственное отличие состоит в том, что я не указал кодек при экспорте. Использование python 3.9.1, pydub 0.25.1 и pyinstaller 4.2   -  person Dimitar    schedule 12.04.2021
comment
Странно, но он начал работать без --onefile в pyinstaller. Работает как с shell = True, так и без него. Я также добавил ffmpeg в PATH, но он все равно не работает с --onefile.   -  person SevaOle    schedule 12.04.2021


Ответы (2)


Скорее всего, PyInstaller не может распознать импортированный плагин. Хотя, если вы пытаетесь создать приложение, я предлагаю вместо этого использовать ярлык, это лучше из-за того, что вы можете настроить значок для ярлыка. Это то, что в основном используют многие приложения.

person BnDLett_Coding    schedule 11.04.2021

Мне удалось решить проблему, только удалив параметр --onefile из pyinstaller и сбросив ffmpeg.exe и ffprobe.exe в полученную папку с файлом main.exe. .

Это не лучшее решение проблемы, так как я бы предпочел использовать --onefile; но это работает.

Я все еще открыт для предложений о том, как заставить его работать с --onefile или просто в целом, почему это происходит.

person SevaOle    schedule 11.04.2021