1 votes

Comment faire en sorte que mon script change mon arrière-plan ?

J'essaie de faire fonctionner un script personnalisé, il fait un travail basique de commutation aléatoire de mes fonds d'écran selon l'heure de la journée à partir de deux dossiers, un dossier a des fonds d'écran "jour" et l'autre a des fonds d'écran "nuit". Le script est déjà un exécutable et il fonctionne lorsque je tape la commande directement dans le terminal comme ceci :

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

J'ai donc créé un cron-job pour l'invoquer toutes les 5 minutes (sur ma crontab utilisateur, pas avec sudo, ça n'a pas marché comme ça non plus), comme ceci :

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

Jusqu'à présent, pour autant que je sache, il devrait fonctionner, et les journaux le reflètent avec ce qui suit :

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)

Mon fond d'écran aurait dû changer 3 fois déjà, mais il reste le même, mais je peux toujours le changer manuellement sur le terminal.

Juste pour être sûr, voici mon arrière-plan changeant script, c'est un tout petit peu bricolé, mais cela fonctionne bien à la fois sur le terminal et en l'exécutant avec l'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)

Vous avez une idée de ce qui pourrait clocher ?

1voto

danzel Points 5094

Comme cette réponse suggère, gsettings besoins de l DBUS_SESSION_BUS_ADDRESS pour être réglé correctement. La fonction Python suivante est basée sur cette réponse et les commentaires :

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

Notez que vous devez également importer re . Appelez cette fonction avant le gsettings appeler.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X