【问题标题】:Executing bash command within a python script called from crontab在从 crontab 调用的 python 脚本中执行 bash 命令
【发布时间】:2020-03-23 09:30:56
【问题描述】:

我正在编写一个 python 脚本,我想从 crontab 调用。它的脚本调用xrandr 命令并将其输出保存在一个变量中,如下所示: output = subprocess.run('xrandr', shell=True, stdout=subprocess.PIPE).stdout.decode('utf-8') 我希望将xrandr 的输出保存在字符串中。 如果我从终端执行它,这一切正常,但如果我使用 cron 运行它,变量 output 保持为空。 其余代码正常执行,所以 cron 不是问题。 那么如何才能使这个命令正确执行呢? 谢谢你的建议。

【问题讨论】:

    标签: python python-3.x cron


    【解决方案1】:

    你想存储输出,可以在这里使用communicate()来帮忙,像这样:

    from subprocess import PIPE
    output = subprocess.run('xrandr', shell=True, stdout=subprocess.PIPE).stdout.decode('utf-8')
    text = output.communicate()[0]
    print(text)
    

    或者也许这个,在这种情况下,您可以删除 .stdout.decode('utf-8') 不太确定,但无论有没有它都可以:

    from subprocess import PIPE
    output = subprocess.run('xrandr', shell=True, stdout=subprocess.PIPE).stdout.decode('utf-8')
    print(output.stdout)
    

    【讨论】:

      【解决方案2】:

      我猜在 cron 环境中没有设置 PATH 变量,所以你应该提供 xrandr 的绝对路径(你可以通过which xrandr 找到它)。 例如。如果这条路径/usr/bin/xrandr试试

      from subprocess import PIPE
      output = subprocess.run('/usr/bin/xrandr', shell=True, stdout=subprocess.PIPE).stdout.decode('utf-8')
      text = output.communicate()[0]
      print(text)
      

      我认为更好的方法是捕获 stderr 并在错误发生时记录错误。

      【讨论】:

      • 问题远不止于此。如果我将 /usr/bin/xrandr 直接放入我的 crontab 中,并将输出重定向到一个文件,它不会做任何事情。我发现 DISPLAY 变量没有在 cron 中设置,但我设法设置它。因此,如果你们中的任何一个知道如何,将非常感激。
      猜你喜欢
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2015-06-28
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 2016-07-25
      相关资源
      最近更新 更多