Запуск python-socketio с SystemD для воспроизведения звуков в фоновом режиме - PullRequest
0 голосов
/ 03 мая 2019

Мой Сервис SystemD файл выглядит следующим образом:

[Unit]
Description=XXX
After=sound.target network.target
Wants=sound.target

[Service]
ExecStart=/usr/bin/python3 -u raspberry.py
WorkingDirectory=/home/pi/Desktop
Restart=always
User=pi
PrivateTmp=true

[Install]
Alias=XXX
WantedBy=multi-user.target

Сценарий python является классическим клиентом python-socketio , который должен прослушивать такие события, как "listen" и играй".Основная часть кода выглядит следующим образом:

import subprocess
import socketio

HOST = "https://XXX.ngrok.io"
sio = socketio.Client(engineio_logger=True)

...

@sio.on('play')
def play(data):
    print("play")
    subprocess.call(["espeak", "'Not working'"])

if __name__ == '__main__':
    subprocess.call(["espeak","'Initialized'"]) 
    sio.connect(HOST)
    sio.wait()

Когда я настраиваю службу для запуска при загрузке, выполняется первый вызов espeak и устанавливается сокет-соединение с моим сервером, но затем, если я отправляюсобытие (через мой сервер), второй вызов espeak не работает (нет звука).Если я загляну в журналы через journalctl -u XXX, я увижу, что функция вызывается, потому что выполняется оператор print.

Что мне приходит в голову, так это то, что это происходит из-за запуска вызова подпроцесса из другого потока, но я не уверен ... есть идеи?

1 Ответ

0 голосов
/ 06 мая 2019

Решение связано с другим моим вопросом на форуме Raspberry Pi .Основной проблемой была невозможность рута воспроизводить звуки.Когда я отлаживал эту проблему, я обнаружил, что из-за User=pi служба запускается как пользователь pi .Но когда я вызываю subprocess.call в @sio.on('play') части, он назывался user root .Это происходило только в @sio.on('play') части.Если бы я сделал это в if __name__ == '__main__': части, вызов был под pi пользователем.До сих пор не знаю, почему это происходило, но решение не использовало AIY шляпную версию Raspbian , а классическую версию Raspbian Stretch Lite .

...