2016-11-21 7 views
0

Ich migriere meine Python-Skripts von einem Server in einen neuen Docker-Container. Aber ich habe ein seltsames Problem mit der Codierung, ich habe mehrere Lösungen ohne Erfolg versucht.Codierung Problem beim Ausführen von Python-Skript von Crontab

Wenn ich das Skript direkt vom Terminal (manuell) ausführen, wird es mit Erfolg ausgeführt. Aber wenn ich durch crontab laufen bekomme ich folgende Fehlermeldung:

UnicodeEncodeError: 'ascii' codec can't encode character

habe ich ein kleines Skript nur die Codierung zu überprüfen:

import sys 
print sys.stdout.encoding 

Wenn ich manuell ausführen bekomme ich folgende Antwort:

UTF-8

Dann fügte ich dieses Skript in cron und leitete die Ausgabe in eine Datei:

* * * * * /tmp/p.py > /tmp/p.log 

Es speicherte eine leere p.log ... Also ich denke, dass Python nicht die Kodierung von der Crontab bekommt.

Ich sah eine Reihe von Vorschlägen in Crontab die Codierung Variablen vor Aufruf des Befehls hinzufügen, aber es hat nicht für mich funktioniert. für exemple:

* * * * * PYTHONIOENCODING=UTF-8 /tmp/p.py > /tmp/p.log 

oder

* * * * * LANG=UTF-8 /tmp/p.py > /tmp/p.log 

Auch habe ich versucht, diese Variablen in der Spitze meiner crontab-Datei hinzugefügt. Kein Erfolg.

ich Ubuntu mit wenigen Gegenden installiert bin mit:

locale -a 
    C 
    C.UTF-8 
    en_US.utf8 
    POSIX 

Und hier ist meine locale (außerhalb von cron):

LANG=en_US.UTF-8 
LANGUAGE= 
LC_CTYPE="en_US.UTF-8" 
LC_NUMERIC="en_US.UTF-8" 
LC_TIME="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8" 
LC_MONETARY="en_US.UTF-8" 
LC_MESSAGES="en_US.UTF-8" 
LC_PAPER="en_US.UTF-8" 
LC_NAME="en_US.UTF-8" 
LC_ADDRESS="en_US.UTF-8" 
LC_TELEPHONE="en_US.UTF-8" 
LC_MEASUREMENT="en_US.UTF-8" 
LC_IDENTIFICATION="en_US.UTF-8" 
LC_ALL= 

ich mehr Python-Skripte ausgeführt habe, so ist es nicht eine gute Idee, um sie zu bearbeiten (auch, wie ich sagte, es läuft perfekt, wenn außerhalb Cron genannt).

Antwort

1

Eigentlich war es ein Problem mit Crontab, es wurde nicht automatisch neu geladen, wenn die Datei bearbeitet wurde.

Um das Neuladen zu erzwingen ich getan habe:

crontab /etc/crontab 

und

service cron restart 

Nun ist die crontab richtig die Umgebungsvariablen geladen ist. In der Kopfzeile der Crontab-Datei haben Sie die folgenden Variablen:

SHELL=/bin/bash 

TERM=xterm 
PYTHONIOENCODING=UTF-8 
LANG=en_US.UTF-8 
LC_ALL=en_US.UTF-8 
Verwandte Themen