Как устранить различия между выполнением cron и терминальным исполнением скрипта python? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь заставить простой скрипт на python периодически запускаться на arch linux с использованием cron, но когда я запускаю его в cron, он ведет себя иначе, чем почему я запускаю его в терминале.

Скрипт загружает обои из картинки дня НАСА и делает их моими, используя программу "feh".Когда я запускаю скрипт в терминале, все нормально, но когда я запускаю его в cron, он загружает файл, но не делает его обоями.

Буду признателен за любую помощь.

#!/usr/bin/env python

import time
import os
import requests
import tempfile
from bs4 import BeautifulSoup

WALLPAPER_LOCATION = "/home/user/.wallpaper.jpg"


def main():
    if os.path.exists(WALLPAPER_LOCATION):
        os.remove(WALLPAPER_LOCATION)
    website = "https://apod.nasa.gov/apod/astropix.html"
    html_txt = getHTML(website)
    img_url = get_image_URL(html_txt)
    downloadFile(img_url, WALLPAPER_LOCATION)
    os.system("/usr/bin/feh --bg-scale " + WALLPAPER_LOCATION)

def downloadFile(url, filepath):
    with open(filepath, 'wb') as handle:
        response = requests.get(url, stream=True)
        if not response.ok:
            print(response)
        for block in response.iter_content(1024):
            if not block:
                break
            handle.write(block)

def getHTML(url):
    html_txt = ""
    temp_html_file = tempfile.NamedTemporaryFile()
    downloadFile(url, temp_html_file.name)

    with open(temp_html_file.name, "r") as reader:
        html_txt = reader.read()
    return html_txt

def get_image_URL(html_doc):
    base_url = "https://apod.nasa.gov/apod/"

    soup = BeautifulSoup(html_doc, "html.parser")
    return base_url + soup.findAll('img')[0]["src"]



if __name__== "__main__":
  main()

1 Ответ

0 голосов
/ 09 июля 2019

@ тот другой парень был прав. Проблема была в том, что cron не знал, какой дисплей использовать, чтобы он мог установить обои. Проблема с программами X11, работающими в cron, упоминается в ссылке, предоставленной @thatotherguy, а также в arch wiki .

Я добавил env DISPLAY=:0 в начало своей работы cron, и теперь все работает нормально.

...