2016-09-16 4 views
1

die einfache Skript Gegeben:Warum löst der Python3-Interpreter UnicodeEncodeError nur aus, wenn er über fcron ausgeführt wird?

#!/usr/bin/env python3 

b = 'строка'.encode() 
print(b.decode('utf-8')) 

Wenn ich es direkt als python3 script.py oder /full/path/to/script.py oder indirekt durch crontab (z 0 0 * * * /full/path/to/script.py), dann ist es normal ausgeführt laufen (ohne Fehler). Aber wenn es durch fcrontab für die gleichen $ USER (mit gleichem Job 0 0 * * * /full/path/to/script.py) dann Python 3.5.2 raise Ausnahme der ausgeführt wird:

Traceback (most recent call last): 
    File "/full/path/to/script.py", line 4, in <module> 
    print(b.decode('utf-8')) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) 

Wie kann es möglich sein? Warum versucht Python Bytes als 'ASCII' anstelle von 'UTF-8' zu dekodieren?

+1

hier Siehe https://wiki.python.org/moin/PrintFails –

+0

Oh, es ist wirklich Problem mit nur 'print' Funktion wegen Gebietsschema, das für fcron-Set (in Mein Fall fcron hat locales 'POSIX' anstelle von * .UTF-8) ... Danke! – kupgov

Antwort

1

Danke an Daniel Voina Lösung gefunden wurde.

Das Problem liegt an der Gebietsschemaumgebung von fcron: Es ersetzt das Standardgebietsschema durch POSIX, so dass Python Unicode nicht nach stdout/stderr schreiben kann. This thread beschreibt Lösung für dieses Problem: es ist nur notwendig Zeile LC_ALL=en_US.UTF-8 (oder andere Gebietsschema-Einstellungen) am Anfang von fcrontab -e hinzufügen und jetzt führt Skript ohne E/A-Fehler.

Beispiel fcrontab -l:

LC_ALL=en_US.UTF-8 
LC_TIME=ru_RU.UTF-8 
0 0 * * * /full/path/to/script.py 
Verwandte Themen