我怎样才能让我的脚本改变我的背景?

我怎样才能让我的脚本改变我的背景?

我正在尝试运行一个自定义脚本,它的基本工作是根据一天中的时间从两个文件夹中随机切换壁纸,一个文件夹有“白天”壁纸,另一个文件夹有“夜晚”壁纸。该脚本已经是可执行文件,当我直接在终端中输入命令时,它确实有效,如下所示:

$ /path/to/my/scripts/twofoldersolution.py

因此,我创建了一个 cron-job,每 5 分钟调用一次(在我的用户 crontab 上,而不是使用 sudo,它也无法那样工作),如下所示:

*/5 * * * * /path/to/my/scripts/twofoldersolution.py

到目前为止,据我所知,它应该可以正常工作,并且日志反映了以下内容:

Aug 30 12:20:01 WarMachine CRON[2877]: (fawtytwo) CMD (/path/to/my/scripts/twofoldersolution.py)
Aug 30 12:25:01 WarMachine CRON[2937]: (fawtytwo) CMD (/path/to/my/scripts/twofoldersolution.py)
Aug 30 12:30:01 WarMachine CRON[3004]: (fawtytwo) CMD (/path/to/my/scripts/twofoldersolution.py)

我的壁纸应该已经改变了3次,但它保持不变,但我仍然可以在终端上手动更改它。

为了安全起见,这里是我的背景更改脚本,它有点黑客,但它在终端上和使用 IDE 运行时都可以正常工作:

#!/usr/bin/env python3
import subprocess
import os
import sys
import time
from os import listdir
from random import choice

global path
path = {
    "day": "/path/to/my/Wallpapers/Day",
    "night": "/path/to/my/Wallpapers/Night"
    }

def setwall(wall):
    #set the wallpaper
    command ="gsettings set org.gnome.desktop.background picture-uri "+\
    "'" + wall + "'"
    subprocess.Popen(["/bin/bash", "-c", command])

def convert_tosecs(t):
    # convert time of the day (hrs/mins) to seconds
    t = [int(n) for n in t.split(":")]
    return (3600*t[0])+(60*t[1])

def timeofday():
    #tells you if it's day or night
    t = convert_tosecs(time.strftime("%H:%M"))
    if t > 21600 and t < 75600: #6:00 - 21:00
        return ("day")
    else:
        return ("night")

def newwall():
    #chooses a new wallpaper depending on time of day
    wallpath = path[timeofday()]
    wallset = listdir(wallpath)
    return (wallpath + "/" + choice(wallset))

if __name__ == "__main__":
    wallpaper = newwall()
    setwall(wallpaper)

对于可能存在什么问题,您有什么想法吗?

答案1

作为这个答案建议,gsettings需要DBUS_SESSION_BUS_ADDRESS正确设置。以下 Python 函数基于该答案和评论:

def setDbusSessionBusAddress():
    pid = subprocess.check_output(["/usr/bin/pgrep", "-u", os.environ["LOGNAME"] , "gnome-session"]).decode("utf-8").strip()
    environment = open("/proc/" + pid + "/environ")
    dbusSessionBusAddress = re.findall("DBUS_SESSION_BUS_ADDRESS=([^\x00]*)", environment.read())[0]
    os.environ["DBUS_SESSION_BUS_ADDRESS"] = dbusSessionBusAddress

注意,需要另外导入re。调用之前先调用该函数gsettings

相关内容