Python3 当 运行 通过 Synology 任务调度程序时出现 UnicodeEncodeError
Python3 UnicodeEncodeError when run via Synology task scheduler
当我通过 Synology 任务调度程序 运行 我的脚本时,我得到 Python3 UnicodeEncodeError。当我通过命令行(使用 PuTTY)运行 脚本时,我没有收到此错误。为什么会这样,我该如何解决?
简单的测试脚本:
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)
命令行输出:
admin@DiskStation:/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:如果我通过命令行 运行 脚本但使用 Python2.7,则会发生较早的(第 1 行)Unicode 错误:(下面仅供参考,Python 3 vs Python2)
admin@DiskStation:/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
admin@DiskStation:/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 中解决,方法是将以下内容作为第一行或第二行添加到脚本中:
# -*- coding: UTF-8 -*-
然后脚本 运行 可以从命令行运行。
但是添加此 UTF-8 行并不能解决 运行从 Synology Task Scheduler 中调用脚本的问题,那么错误仍然出现?!:
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)
当从命令行 运行 时,Python 检测终端的编码并以该编码将 Unicode 文本编码到终端。当 运行 在您的任务调度程序下时,Python 未检测输出编码并且默认为 ascii
。
当将源编码声明为 utf8
时,它在 Python 2 中起作用,因为您没有使用 Unicode 字符串,而 print
只是将 UTF-8 编码的字节字符串发送到终点站。您的终端是 UTF-8,因此可以使用。
您可以通过在调度程序下 运行 时设置环境变量 PYTHONIOENCODING=utf8
来覆盖 Python 的默认假设。该变量在所有平台下都可用。
哇,非常感谢,这就解决了!仅供参考我所做的一切:
我加了
export PYTHONIOENCODING=UTF-8
到 Synology 任务调度程序中 'run command' 下的 'user defined script'。
-> 完整的 运行 命令现在是:
export PYTHONIOENCODING=UTF-8
/volume1/@appstore/py3k/usr/local/bin/python3
/volume1/Documenten/MyPythonScripts/Test.py
我在使用 glob.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)
在调度程序脚本中设置 PYTHONIOENCODING 变量对我没有帮助。
但是我找到了另一个适合我的解决方案:设置 LANG 环境变量,例如:
export LANG=en_US.UTF-8
配置:
- DSM 6.0.2-8451 更新 9
- Python 3.5.1-0104
当我通过 Synology 任务调度程序 运行 我的脚本时,我得到 Python3 UnicodeEncodeError。当我通过命令行(使用 PuTTY)运行 脚本时,我没有收到此错误。为什么会这样,我该如何解决?
简单的测试脚本:
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)
命令行输出:
admin@DiskStation:/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:如果我通过命令行 运行 脚本但使用 Python2.7,则会发生较早的(第 1 行)Unicode 错误:(下面仅供参考,Python 3 vs Python2)
admin@DiskStation:/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
admin@DiskStation:/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 中解决,方法是将以下内容作为第一行或第二行添加到脚本中:
# -*- coding: UTF-8 -*-
然后脚本 运行 可以从命令行运行。
但是添加此 UTF-8 行并不能解决 运行从 Synology Task Scheduler 中调用脚本的问题,那么错误仍然出现?!:
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)
当从命令行 运行 时,Python 检测终端的编码并以该编码将 Unicode 文本编码到终端。当 运行 在您的任务调度程序下时,Python 未检测输出编码并且默认为 ascii
。
当将源编码声明为 utf8
时,它在 Python 2 中起作用,因为您没有使用 Unicode 字符串,而 print
只是将 UTF-8 编码的字节字符串发送到终点站。您的终端是 UTF-8,因此可以使用。
您可以通过在调度程序下 运行 时设置环境变量 PYTHONIOENCODING=utf8
来覆盖 Python 的默认假设。该变量在所有平台下都可用。
哇,非常感谢,这就解决了!仅供参考我所做的一切:
我加了
export PYTHONIOENCODING=UTF-8
到 Synology 任务调度程序中 'run command' 下的 'user defined script'。 -> 完整的 运行 命令现在是:
export PYTHONIOENCODING=UTF-8
/volume1/@appstore/py3k/usr/local/bin/python3
/volume1/Documenten/MyPythonScripts/Test.py
我在使用 glob.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)
在调度程序脚本中设置 PYTHONIOENCODING 变量对我没有帮助。 但是我找到了另一个适合我的解决方案:设置 LANG 环境变量,例如:
export LANG=en_US.UTF-8
配置:
- DSM 6.0.2-8451 更新 9
- Python 3.5.1-0104