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», чтобы получить полный список команд и синтаксиса.