Pygame不会播放音频,但仅在作为守护进程运行时播放

2024-05-17 16:29:58 发布

您现在位置:Python中文网/ 问答频道 /正文

一点背景:我有一个运行Raspbian(Debian)9.11的Raspberry Pi 3b。这个原始Pi运行一个Python3脚本,该脚本捕获来自手持扫描仪的文本输入,并将其发送到MySQL数据库,然后播放一个wav文件,以便扫描的员工知道它成功了。我对这个过程进行了后台监控,以便更容易重新启动(有时扫描仪会与USB加密狗失去同步)。守护进程文件中的主线是

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

我不得不为一个我被要求创建的新实例稍微改变这个过程,所以我将Raspbian 10.4(最新版本)加载到另一个Pi 3b上,并将所有内容都移到另一个Pi 3b上,只需稍加调整,它现在插入到本地Maria DB(MySQL)中。守护进程运行正常。。。除了没有音频播放(但DB插入仍然发生)。真正奇怪的是,当我在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)

我如何调试它为什么不能在守护进程模式下工作


Tags: 文件homedb进程pipygamescannerdesktop
1条回答
网友
1楼 · 发布于 2024-05-17 16:29:58

我猜这与从Raspberry Pi OS到Linux内核5.4的转变有关(旧的Pi运行的是内核4.19)。我使用pip升级到PyGame1.9.6,这在停止或重新启动服务时将此错误添加到系统日志中

Sep 3 08:40:46 raspberrypi kernel: [164439.999815] bcm2835_audio bcm2835_audio: failed to close VCHI service connection (status=1)

金斯利在评论中问这是在哪个用户下运行的,答案是root(我从未在系统服务文件中指定过用户)。然而,我注意到Thonny在“pi”用户下运行。我想打一针可能有用,所以我补充说

User=pi

到我的服务文件,现在Pygame音频在服务中再次工作

相关问题 更多 >