【问题标题】:Python3 UnicodeEncodeError when run via Synology task scheduler通过 Synology 任务计划程序运行时出现 Python3 UnicodeEncodeError
【发布时间】:2016-07-03 21:27:23
【问题描述】:

当我通过 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 与 Python 2)

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 任务计划程序运行脚本的问题,那么仍然会引发错误?!:

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)

【问题讨论】:

    标签: linux python-3.x unicode synology


    【解决方案1】:

    从命令行运行时,Python 会检测终端的编码并将 Unicode 文本以该编码编码到终端。在任务调度程序下运行时,Python 不会检测输出编码,默认为 ascii

    当将源编码声明为utf8 时,它在 Python 2 中有效,因为您没有使用 Unicode 字符串,而print 只是将 UTF-8 编码的字节字符串发送到终端。你的终端是 UTF-8,所以它可以工作。

    在调度程序下运行时,您可以通过设置环境变量PYTHONIOENCODING=utf8 来覆盖Python 的默认假设。该变量在所有平台下都可用。

    参考:PYTHONIOENCODING

    【讨论】:

      【解决方案2】:

      我在使用 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

      【讨论】:

        【解决方案3】:

        哇,非常感谢,这解决了!仅供参考我所做的一切:

        我加了

        export PYTHONIOENCODING=UTF-8
        

        到 Synology 任务计划程序中“运行命令”下的“用户定义脚本”。 -> 完整的运行命令现在是:

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

        【讨论】:

          猜你喜欢
          • 2015-08-08
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-21
          相关资源
          最近更新 更多