【问题标题】:Running python-socketio with SystemD to play sounds at background使用 SystemD 运行 python-socketio 以在后台播放声音
【发布时间】:2019-05-03 09:24:15
【问题描述】:

我的 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”和“play”之类的事件。代码的主要部分如下所示:

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 查看日志,我会看到调用该函数是因为执行了打印语句。

我想到的是这是因为从不同的线程运行子进程调用,但我不确定..有什么想法吗?

【问题讨论】:

  • 不同线程可能会出现问题,因为它们可以正常工作def threaded_function(): subprocess.call(["espeak", "'Call from threaded function.'"]) if __name__ == '__main__': subprocess.call(["espeak","'Initialized'"]) thread = Thread(target = threaded_function) thread.start() thread.join()

标签: python socket.io subprocess systemd


【解决方案1】:

解决方案与我在Raspberry Pi forum 的另一个问题有关。主要问题是root无法播放声音。在调试这个问题的时候,我发现因为User=pi服务是以user pi启动的。但是当我在@sio.on('play') 部分中调用subprocess.call 时,它被称为user root。它只发生在@sio.on('play') 部分。如果我在if __name__ == '__main__': 部分执行此操作,则调用在pi 用户下。仍然不知道为什么会这样,但解决方案不是使用 AIY 帽子版本的 Raspbian,而是使用经典版本 Raspbian Stretch Lite

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多