2016-07-03 34 views
1

Ich bekomme einen Python3 UnicodeEncodeError, wenn ich mein Skript über den Synology Task Scheduler ausführe. Ich erhalte diesen Fehler nicht, wenn ich das Skript über die Kommandozeile (mit PuTTY) ausführe. Warum ist das und wie kann ich es lösen?Python3 UnicodeEncodeError bei Ausführung über Synology Task Scheduler

Einfache Testskript:

import sys 
print (sys.version) # to confirm the correct Python version 
print("Fichier non trouvé♠ #M–Nein") # to test non ascii characters 
test = "Fichier non trouvé♠ #M–Nein" 
print ("test is " + test) 
test2 = str(test) # to test if the string function causes and issue 
print ("test2 is " + test2) 

Commandline-Ausgang:

[email protected]:/volume1/@appstore/py3k/usr/local/bin$ /volume1/@appstore/py3k/usr/local/bin/python3 /volume1/Documenten/MyPythonScripts/Test.py 
3.5.1 (default, Feb 23 2016, 17:46:04) 
[GCC 4.9.3 20150311 (prerelease)] 
Fichier non trouvé♠ #M–Nein 
test is Fichier non trouvé♠ #M–Nein 
test2 is Fichier non trouvé♠ #M–Nein 

Task-Scheduler Ausgabe:

3.5.1 (default, Feb 23 2016, 17:46:04) 
[GCC 4.9.3 20150311 (prerelease)] 
Traceback (most recent call last): 
    File "/volume1/Documenten/MyPythonScripts/Test.py", line 3, in <module> 
    print("Fichier non trouv\xe9\u2660 #M\u2013Nein") # to test non ascii characters 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 17-18: ordinal not in range(128) 

Hinweis: Die gleiche Python-Version und Skript laufen mit

/volume1/@appstore/py3k/usr/local/bin/python3 
/volume1/Documenten/MyPythonScripts/Test.py 

in beiden Situationen.

Hinweis 2: Eine frühere (Linie 1) Unicode-Fehler treten auf, wenn ich das Skript über die Kommandozeile, aber mit python2.7 laufen: (FYI unten, Python 3 vs Python 2)

[email protected]:/volume1/Documenten/MyPythonScripts$ **python3** Test.py 
Fichier non trouvé♠ #M–Nein 
test is Fichier non trouvé♠ #M–Nein 
test2 is Fichier non trouvé♠ #M–Nein 
[email protected]:/volume1/Documenten/MyPythonScripts$ **python** Test.py 
    File "Test.py", line 1 
SyntaxError: Non-ASCII character '\xc3' in file Test.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 

Diese Unicode-Ausgabe kann

# -*- coding: UTF-8 -*- 

Dann wird das Skript läuft gut von der Kommandozeile: indem Sie die folgende als 1. oder 2. Zeile, um das Skript in python2.7 gelöst werden.

Aber Addiert man diese UTF-8 Linie löst nicht das Problem mit dem Skript aus dem Synology Taskplaner ausgeführt wird, dann wird der Fehler noch erhöht:?!

3.5.1 (default, Feb 23 2016, 17:46:04) 
[GCC 4.9.3 20150311 (prerelease)] 
Traceback (most recent call last): 
    File "/volume1/Documenten/MyPythonScripts/Test.py", line 4, in <module> 
    print("Fichier non trouv\xe9\u2660 #M\u2013Nein") # to test non ascii characters 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 17-18: ordinal not in range(128) 

Antwort

1

Wenn von der Befehlszeile ausgeführt wird, Python erkennt die Codierung des Terminals und codiert Unicode-Text in das Terminal in dieser Codierung. Wenn Python im Taskplaner ausgeführt wird, erkennt es die Ausgabecodierung nicht und verwendet standardmäßig ascii.

Es funktioniert in Python 2 beim Deklarieren der Quellcodierung als utf8, weil Sie keine Unicode-Zeichenfolgen verwenden und print nur die UTF-8-codierte Byte-Zeichenfolge an das Terminal sendet. Ihr Terminal ist UTF-8, also funktioniert es.

Sie können die Standardannahmen von Python überschreiben, indem Sie die Umgebungsvariable PYTHONIOENCODING=utf8 beim Ausführen unter dem Scheduler setzen. Diese Variable ist unter allen Plattformen verfügbar.

Ref: PYTHONIOENCODING

0

Wow, vielen Dank, dies löst es! FYI alles, was ich getan habe:

Ich habe

export PYTHONIOENCODING=UTF-8 

auf die 'benutzerdefinierte Skript' unter dem 'Befehl ausführen' in den Synology Task-Scheduler. -> der komplette Laufbefehl ist jetzt:

export PYTHONIOENCODING=UTF-8 
/volume1/@appstore/py3k/usr/local/bin/python3 
/volume1/Documenten/MyPythonScripts/Test.py 
0

ich gleiches Problem hatte (mit dem gleichen Fehler), wenn ich glob verwenden.py:

"/volume1/@appstore/py3k/usr/local/lib/python3.5/glob.py", line 85, in glob1 
    names = os.listdir(dirname) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 20-33: ordinal not in range(128) 

Set PYTHONIOENCODING Variable in Scheduler-Skript nicht für mich helfen. Aber ich fand eine andere Lösung, die für mich funktioniert: set LANG Umgebungsvariable, zB:

export LANG=en_US.UTF-8 

Konfiguration:

  • DSM 6.0.2-8451 Update 9
  • Python 3.5.1 -0104