2016-07-03 2 views
1

Я получаю Python3 UnicodeEncodeError при запуске моего скрипта с помощью планировщика задач Synology. Я не получаю эту ошибку, когда запускаю скрипт через командную строку (используя PuTTY). Почему это и как я могу это решить?Python3 UnicodeEncodeError при запуске через планировщик задач Synology

Простой тестовый скрипт:

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:

[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 

Задача вывода планировщика:

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) 

Примечание: Та же версия Python и скрипт выполняются с помощью

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

в обеих ситуациях.

Примечание2: ранее (строка 1) ошибка Unicode происходит, если я запустить скрипт через командную строку, но используя python2.7: (FYI ниже, Python 3 против 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 

Эта проблема Unicode может быть решена в python2.7, добавив следующее в качестве 1-й или 2-й линии к сценарию:

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

Затем скрипт работает нормально из командной строки.

Но Складывая это UTF-8 строку не решает проблемы с запуском скрипта из Synology планировщика задач, то ошибка все еще поднят?!

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) 

ответ

1

При запуске из командной строки, Python обнаруживает кодирование терминала и кодирует текст Unicode терминалу в этой кодировке. При запуске под вашим планировщиком задач Python не обнаруживает выходную кодировку и по умолчанию имеет значение ascii.

Он работает в Python 2 при объявлении кодировки источника, как utf8, потому что вы не используете Unicode строк и print просто отправляет UTF-8 кодировке байт строки в терминале. Ваш терминал UTF-8, поэтому он работает.

Вы можете переопределить предположения по умолчанию Python, установив переменную окружения PYTHONIOENCODING=utf8 при запуске под планировщиком. Эта переменная доступна на всех платформах.

Ref: PYTHONIOENCODING

0

Wow, большое спасибо, это решает это! FYI все, что я сделал:

Я добавил

export PYTHONIOENCODING=UTF-8 

к «определенному пользователю сценарию» под «запуском команды» в планировщик задач Synology. -> полная команда запуска теперь:

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

У меня была такая же проблема (с той же ошибкой), когда я использую Glob.ру:

"/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) 

Набор PYTHONIOENCODING переменная планировщика сценария не помогло мне. Но я нашел другое решение, которое работает для меня: установить LANG переменных среды, например:

export LANG=en_US.UTF-8 

Конфигурация:

  • DSM 6.0.2-8451 Update 9
  • Python 3.5.1 -0104
Смежные вопросы