Как я могу заставить свой сценарий изменять мое образование?

Я пытаюсь заставить пользовательский сценарий работать, он делает основное задание переключения случайным образом моих обоев в зависимости от времени суток от двух папок, одна папка имеет "дневные" обои, и другой имеет "ночные" обои. Сценарий уже является исполняемым файлом, и он действительно работает, когда я ввожу команду непосредственно в терминал как это:

$ /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)

Какие-либо идеи о том, что могло бы быть неправильным?

1
задан 30 August 2019 в 20:47

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 звонить.

1
ответ дан 7 December 2019 в 14:59

Другие вопросы по тегам:

Похожие вопросы: