Я пытаюсь заставить пользовательский сценарий работать, он делает основное задание переключения случайным образом моих обоев в зависимости от времени суток от двух папок, одна папка имеет "дневные" обои, и другой имеет "ночные" обои. Сценарий уже является исполняемым файлом, и он действительно работает, когда я ввожу команду непосредственно в терминал как это:
$ /path/to/my/scripts/twofoldersolution.py
Так, я сделал задание крона для вызова его каждые 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 раза, но они остаются такими же, но я могу все еще изменить их вручную на терминале.
Только, чтобы быть на безопасной стороне, вот мой фоновый сценарий изменения, это - крошечный бит hacky, но это хорошо работает и на терминале и на выполнении его с 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)
Какие-либо идеи о том, что могло бы быть неправильным?
Поскольку этот ответ предлагает, 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
звонить.