【发布时间】: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