2017-03-18 4 views
0

Ich bin Ubuntu Mate auf meinem Raspberry PI laufen. Ich habe einen Web-Scrapper in Python geschrieben, den ich einmal am Tag ausführen möchte. Ich dachte, mit sudo crontab -e wäre ein guter Weg, um zu tun. Das Problem, das ich habe, ist, wenn das cronjob mein Python-Skript startet, das Python-Skript einen Importfehler auslöst und nicht ausgeführt wird. Wenn ich das Python-Skript jedoch direkt über die Befehlszeile ausfühle, wird es ohne Probleme ausgeführt.Crontab zum Starten von Python Script auf Raspberry Pi verursacht Importfehler

Ich habe gelesen, dass einige Leute ein Shell-Skript verwenden, um sie Python-Skript zu starten, also habe ich das auch versucht. Wieder funktioniert es wie erwartet, wenn ich das Shell-Skript direkt von der Befehlszeile aus ausführe, funktioniert aber nicht, wenn es von cronjob ausgeführt wird.

Zu Testzwecken habe ich jetzt die cronjob jede Minute auszuführen, bis ich herausfinden, was los ist. Sobald es wie erwartet funktioniert, ändere ich die Zeit, die es ausführt, etwas näher an das, was ich möchte.

Um Ihnen eine Vorstellung davon zu geben, wie meine Dateien aussehen, sehen Sie unten nach. Wie Sie sehen können, müssen alle Dateien, die ausgeführt werden müssen, Prilivages ausführen.

web_scraper.py

#!/usr/bin/env python 

import click 
import logging 
import os 
from datetime import datetime 
from bs4 import BeautifulSoup as bs 
import re 
import urlparse 
... 

start.sh

#!/bin/bash 

cd /home/elmer/ 

python web_scraper.py 

Sudo crontab -e

* * * * * sh /home/elmer/start.sh >> /home/elmer/cron.log 2>&1 

cron.log

Traceback (most recent call last): 
    File "web_scraper.py", line 6, in <module> 
    import click 

ls -lh

(py27)[email protected]:$ ls -lh 
total 56K 
-rw-rw-r-- 1 elmer elmer 2.9K Mar 17 20:38 cron.log 
-rwxrwxrwx 1 elmer elmer 8.2K Mar 16 09:54 web_scraper.py 
-rwxrwxrwx 1 elmer elmer 64 Mar 17 20:02 start.sh 

Antwort

1

Das Problem ist, dass Sie Ihr Skript wie dich selbst laufen lassen, aber dann steckt man es in cron als root. Diese zwei verschiedenen Benutzer haben sehr unterschiedliche Umgebungen.

Sie sollten einfach crontab -e anstelle von sudo crontab -e verwenden, um es in den Cron Ihres eigenen Accounts zu setzen. Sie können auch die sh vom Anfang Ihrer Cron-Befehlszeile entfernen, da dies die Standardeinstellung ist.

Falls es immer noch nicht funktioniert, ist die Lösung für echo $PYTHONPATH in Ihrem normalen Shell wahrscheinlich, dann hinzufügen, dass cron Einstellung:

PYTHONPATH=/your/path/here 
* * * * * python /home/elmer/web_scraper.py >> /home/elmer/cron.log 2>&1 

Einen weiteren guten Grund, nicht sudo crontab zu verwenden, ist, dass, wenn Sie ausführen, um Ihre Skript als root, irgendwelche Fehler, die es hat, könnte Ihr System ruinieren.