zoukankan      html  css  js  c++  java
  • 解决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在输出音频时也会向此文件夹内写入东西。

  • 相关阅读:
    Python字符串学习相关问题
    Python函数学习遇到的问题
    How to configure ODBC DSN to access local DB2 for Windows
    如何在Eclipse CDT中编译含有多个main函数的项目
    MakeFile 文件的作用
    云技术:负载均衡SLB
    云技术:弹性计算ECS
    《老罗的Android之旅》导读PPT
    服务器集群负载均衡技术
    杭电ACM 1004题
  • 原文地址:https://www.cnblogs.com/qjfoidnh/p/12105194.html
Copyright © 2011-2022 走看看