Python, mpg123 и подпроцесс неправильно используют stdin.write или общаются

Хорошо, так что мой Google-фу действительно отстой, и я не смог найти ответ, надеюсь, вы, ребята, можете мне помочь ^_^

Итак, то, что я подумал, что простой сценарий, по-видимому, неправильно связывается со своим подпроцессом, я запускаю эту строку построчно. Я также использую плеер mpg123, это система Linux (ну, Raspberry Pi)

    from subprocess import Popen, PIPE, STDOUT
    p = Popen(["mpg123", "-C", "test.mp3"], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
    #wait a few seconds to enter this, "q" without a newline is how the controls for the player work to quit out if it were ran like "mpg123 -C test.mp3" on the command line
    p.communicate(input='q')[0]

Я могу просто запустить stdout.read(), но использование коммуникации для ввода просто приводит к зависанию, а p.stdin.write('q'), похоже, вообще ничего не делает. Это связано с питоном, хотя у меня есть ощущение, что я не ищу нужное место в документации mpg123. Пожалуйста, будьте добры, поскольку я исключительно новичок в этом ^_^

2 ответа

Проверьте, какие аргументы ваши mpg123 версия понимает. На моей машине работает следующее:

#!/usr/bin/env python3
import time
from subprocess import Popen, PIPE, DEVNULL, STDOUT

p = Popen(["mpg123", "-K", "test.mp3"], stdin=PIPE, stdout=DEVNULL, stderr=STDOUT)

# wait a little
time.sleep(3)

# send command "Skip song", wait for the player to exit
p.communicate(b'n')[0]

Он начинает воспроизведение файла, ждет ~3 секунды и завершает работу.

Это ужасное решение, но оно работает в крайнем случае. Я использую это как патч, потому что по какой-то причине я не могу заставить библиотеки Python правильно воспроизводиться на моем Raspberry Pi.

Если вы начнете mpg123 в удаленном режиме () вы можете гораздо проще отправлять ему команды:

      proc = sp.Popen(["mpg123", "-R"], stdin=sp.PIPE)

Затем вы можете отправлять команды на его stdin атрибут.

Примечание:

  • Команды разные. Чтобы сделать паузу, это "pause", нет " "Например. Запустить mpg123 -R в консоли, затем отправьте ему help command, чтобы увидеть список команд.
  • Команды должны завершаться новой строкой.

Из документов:

-R, --remote

Активируйте общий интерфейс управления. Затем mpg123 будет читать и выполнять команды из stdin. Основное использование - это «загрузка» для воспроизведения какого-либо файла и очевидная команда «пауза», «». ''jump '' будет переходить / искать заданную точку (номер кадра MPEG). Введите «help», чтобы получить полный список команд и синтаксиса.

Другие вопросы по тегам