2016-07-03 31 views
1

Synologyタスクスケジューラを使用してスクリプトを実行すると、Python3 UnicodeEncodeErrorが発生します。コマンドラインから(PuTTYを使用して)スクリプトを実行すると、このエラーは発生しません。これはなぜですか、どうすれば解決できますか?Synologyタスクスケジューラ経由でPython3 UnicodeEncodeErrorを実行する

シンプルなテストスクリプト:

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) 

コマンドライン出力:

[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のバージョンとスクリプトが実行されている使用して

両方の状況で

注2:私は、コマンドライン経由でスクリプトを実行するが、Python2.7を使用している場合は、以前の(ライン1)Unicodeのエラーが発生します(FYI以下、Pythonの2対Pythonの3)を

[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の問題ことができますスクリプトに第1行または第2行として次を追加して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) 

答えて

1

コマンドラインから実行する場合は、Pythonの端末の符号化を検出し、その符号化で端末にUnicodeテキストを符号化する。あなたのタスクスケジューラの下で動作しているとき、Pythonは出力エンコーディングを検出せず、デフォルトでasciiになっています。

ソースコードをutf8と宣言したときは、Unicode文字列を使用していないため、printはUTF-8でエンコードされたバイト文字列を端末に送信するだけなので、Python 2で動作します。あなたの端末はUTF-8なので、動作します。

スケジューラで実行しているときに環境変数PYTHONIOENCODING=utf8を設定することで、Pythonのデフォルト仮定を上書きできます。この変数は、すべてのプラットフォームで使用できます。

参考:PYTHONIOENCODING

0

うわー、多くのおかげで、これはそれを解決します!私が行っているFYIすべて:

を私はSynologyのタスクスケジューラの「runコマンド」の下の「ユーザー定義のスクリプト」に

export PYTHONIOENCODING=UTF-8 

を追加しました。 - >完全な実行コマンドは以下のようになります。

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

私はグロブを使用する場合(同じエラーで)同じ問題を抱えていました。PY:スケジューラ・スクリプトで設定PYTHONIOENCODING変数が私のために助けにはならなかった

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

。 しかし、私は私のために働く別の解決策を見つけた:LANG環境変数を設定し、例えば:

export LANG=en_US.UTF-8 

構成:

  • をDSM 6.0.2-8451更新9
  • のPython 3.5.1 -0104
関連する問題