Pygame将不会播放音频,而只会在作为守护程序运行时播放

问题描述

背景知识:我有一个运行Raspbian(Debian)9.11的RaspBerry Pi 3b。原始的Pi运行Python 3脚本,该脚本捕获来自手持式扫描仪的文本输入并将其发送到MysqL数据库,然后播放wav文件,以便扫描的员工知道此操作成功。我将其守护进程化,以便更轻松地重新启动(有时扫描仪会与其USB加密狗失去同步)。守护程序文件中的主行是

ExecStart=/usr/bin/python3 /home/pi/Desktop/scanner.py

我不得不为创建一个新实例而稍稍更改流程,因此我将Raspbian 10.4(最新版)加载到另一个Pi 3b上,然后进行了一点微调,然后将其插入到本地Maria DB中,从而完成了所有操作(基本上是MysqL)。守护程序运行得很好...除了不播放音频(但仍会插入数据库)。真正奇怪的是,当我将其加载到Thonny中时,它可以正常播放文件。系统日志中没有任何内容表明Python或Pygame正在生成任何错误

这里的相关代码(缩写)是

import pygame.mixer
# sets up sound
pygame.mixer.init()
goodscan = pygame.mixer.sound('/home/pi/Desktop/goodscan.wav')
duplicatescan = pygame.mixer.sound('/home/pi/Desktop/duplicateScan.wav')
badscan = pygame.mixer.sound('/home/pi/Desktop/badScan.wav')

#function that the USB listener calls
def scan(scanner):
    #some scanner processing codes here
    if prevScan == x:
        duplicatescan.play()
        print("Duplicate Scan")
        continue;
                 
     else:
        splits = x.split('-')
        if(len(splits) < 3):
            print("No prefix provided")
            #write to error log
            badscan.play();
            continue;
        prefix = splits[0][0] + splits[0][1]
        po = splits[1] + '-' + splits[2]
        scanner_number = splits[0][2] + splits[0][3]
        polist.extend([po,prefixes[prefix],scanner_number])
        goodscan.play()
        
        #DB insert (this always works)                
        scans = {
           "timestamp": time_str,"ponum": x,"status": polist[1],"scanner": polist[2]
        }
        statusUpdate.databaseUpdate(polist)

如何调试为什么它在守护程序模式下不起作用?

解决方法

我猜想这与从Raspberry Pi OS到Linux内核5.4的转变有关(较早的Pi正在运行4.19内核)。我使用pip升级到Pygame 1.9.6,在停止或重新启动服务时,此错误已添加到系统日志中

9月3日08:40:46 raspberrypi内核:[164439.999815] bcm2835_audio bcm2835_audio:无法关闭VCHI服务连接(状态= 1)

Kingsley在评论中询问该用户在哪个用户下运行,答案是root(我从未在系统服务文件中指定用户)。但是,我注意到Thonny在“ pi”用户下运行。我认为可以尝试一下,所以我添加了

User=pi

到我的服务文件,现在Pygame音频在该服务中再次起作用。