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