解决crontab里的脚本调用mplayer播放音乐无声音的问题

问题描述

最近要在deepin上跑一个定时脚本,功能是每天到点从redis里取文字并利用百度API转为语音,然后播放。脚本用Python编写,大体思路是获得语音文件后,用Python的pexpect模块模拟终端调用mplayer播放。之前在树莓派上运行的都很正常,在deepin终端里直接运行也没问题,但加入到crontab里却不对劲了:能观测到脚本无异常执行完,但音箱却一直没有声音,换用pygame也未解决。

解决方法

直接上结论。在Python脚本开头加入两行:

import os
os.environ['XDG_RUNTIME_DIR'] = "/run/user/1000" #这里1000为当前用户的uid

原因探究

熟悉crontab的应该知道,cron里的环境变量是个很坑爹的事儿,所以我们的脚本里通常需要手动加上所需的环境变量,或者直接使用绝对路径;而Python在模拟终端时,会继承运行此py脚本的shell环境,所以被cron调起时,Python脚本的环境变量基本是空的,问题基本可以确定就出在这上面。

最终能够确定导致问题的环境变量,得益于https://www.kutu66.com/ubuntu/article_169775这篇问答。这个关键的环境变量叫XDG_RUNTIME_DIR,那它是什么?

https://askubuntu.com/questions/872792/what-is-xdg-runtime-dir中,有老外给出了回答:

"What is XDG_RUNTIME_DIR?", it is an environment variable that is set automatically when you log in. It tells any program you run where to find a user-specific directory in which it can store small temporary files. 

根据回答,这个变量指定了当前用户专属的临时文件目录;在网上搜索此环境变量,也确实能发现它未指定时会导致一些异常(通常与图形界面有关),可能mplayer在输出音频时也会向此文件夹内写入东西。

posted @ 2019-12-26 23:59  qjfoidnh  阅读(553)  评论(0编辑  收藏  举报