(Windows)Почему вывод подпроцесса для подпроцесса настолько ненадежный с Python?
Я написал код Python, который вызывает программу SoX (модуль подпроцесса), которая выводит прогресс на STDERR, если вы укажете его для этого. Я хочу получить статус процента от результата. Если я называю это не из сценария Python, он начинается сразу и имеет плавное продвижение до 100%.
Если я вызываю его из сценария Python, он длится несколько секунд до его запуска, а затем он чередуется между медленным выходом и быстрым выходом. Хотя я читаю char char, иногда там вырывает большой блок. Поэтому я не понимаю, почему в другое время я могу наблюдать за тем, чтобы персонажи становились все больше друг за другом. (Он генерирует 15KiB данных в моем тесте, между прочим.)
Я тестировал то же самое с mkvmerge и mkvextract. Они также выводят проценты. Чтение STDOUT происходит гладко.
Это настолько ненадежно! Как я могу сделать чтение потока stderr sox более плавным и, возможно, предотвратить задержку в начале?
Как звонить и читать:
process = subprocess.Popen('sox_call_dummy.bat', stderr = subprocess.PIPE, stdout = subprocess.PIPE)
while True:
char = process.stderr.read(1).encode('string-escape')
sys.stdout.write(char)
Какое значение имеет значение bufsize? Вы можете показать свой фрагмент подпроцесса? – jdi
Zero (по умолчанию). Но я только что протестировал 1, 1024, 8 * 1024, 16 * 1024, 160 * 1024, это то же самое с каждым значением. – rynd
Отправьте пример кода, как вы звоните и читаете свой процесс. – jdi