8

最初の投稿ですので、親切にしてください。私はたくさん検索しましたが、見つかったほとんどのものは Python 2 に関連しています。

ファイル リストから zip ファイルを作成する Python3 スクリプトがあります。スクリプトが crontab から実行された場合にのみ UnicodeEncodeError で失敗しますが、対話型コンソールから実行された場合は問題なく動作します。環境に何かがあるに違いないと思いますが、何が何であるかを理解できないようです。

これはコードの抜粋です:

def zipFileList(self, rootfolder, filelist, zip_file, logger):
    count = 0

    logger.info("Generazione file zip {0}: da {1} files".format(zip_file, len(filelist)))
    zip = zipfile.ZipFile(zip_file, "w", compression=zipfile.ZIP_DEFLATED)

    for curfile in filelist:
        zip.write(os.path.join(rootfolder, curfile), curfile, zipfile.ZIP_DEFLATED)
        count = count + 1

    zip.close()
    logger.info("Scrittura terminata: {0} files".format(count))

これは、このコード フラグメントのログ出力です。

2012-07-31 09:10:03,033: root - ERROR - Traceback (most recent call last):
  File "/usr/local/lib/python3.2/zipfile.py", line 365, in _encodeFilenameFlags
  return self.filename.encode('ascii'), self.flag_bits
UnicodeEncodeError: 'ascii' codec can't encode characters in position 56-57: ordinal not in range(128)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "XBE.py", line 45, in main
    pam.executeList(logger)
  File "/home/vte/vtebackup/vte41/scripts/ptActivityManager.py", line 62, in executeList
    self.executeActivity(act, logger)
  File "/home/vte/vtebackup/vte41/scripts/ptActivityManager.py", line 71, in executeActivity
    self.exAct_FileBackup(act, logger)
  File "/home/vte/vtebackup/vte41/scripts/ptActivityManager.py", line 112, in exAct_FileBackup
    ptfs.zipFileList(srcfolder, filelist, arcfilename, logger)
  File "/home/vte/vtebackup/vte41/scripts/ptFileManager.py", line 143, in zipFileList
    zip.write(os.path.join(rootfolder, curfile), curfile, zipfile.ZIP_DEFLATED)
  File "/usr/local/lib/python3.2/zipfile.py", line 1115, in write
    self.fp.write(zinfo.FileHeader())
  File "/usr/local/lib/python3.2/zipfile.py", line 355, in FileHeader
    filename, flag_bits = self._encodeFilenameFlags()
  File "/usr/local/lib/python3.2/zipfile.py", line 367, in _encodeFilenameFlags
    return self.filename.encode('utf-8'), self.flag_bits | 0x800
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 56: surrogates not allowed

これはcrontab行です:

10 9 * * * /home/vte/vtebackup/vte41/scripts/runbackup.sh >/dev/null 2>&1

そして、これは runbackup.sh の内容です:

#! /bin/bash -l

cd /home/vte/vtebackup/vte41/scripts

/usr/local/bin/python3.2 XBE.py

例外が発生するファイルは常に同じですが、非ASCII文字は含まれていないようです:

/var/vhosts/vte41/http_docs/vtecrm41/storage/2012/July/week4/169933_Puccini_Gabriele.tif

OS は Ubuntu Linux LTS 10.04、Python バージョン 3.2 (他の Python バージョンと altinstall としてサイド バイ サイドでインストール) です。すべての Python ソース ファイルには、このシバンがあります。

#!/usr/bin/env python3.2

一番最初の行として

何が問題なのか、この問題を解決する方法を見つけるのを手伝ってもらえますか?

4

3 に答える 3

21

チーム メンバーがPython バグ スレッドで解決策を見つけました。

この問題は、スクリプト コマンドの前に LANG ディレクティブを追加することで修正されました。

* * * * * LANG=it_IT.UTF-8 /home/vte/vtebackup/vte41/scripts/runbackup.sh >/dev/null 2>&1

これについてしばらく頭を悩ませたので、これが他の人に役立つことを願っています:)

于 2012-07-31T08:03:32.040 に答える
8

ロケールを確認してください。インタラクティブ コンソールで、コマンドを実行しlocaleます。ここに私が得るものがあります:

LANG=
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

LC_CTYPEPython は、または環境変数に基づいてファイル名を解釈する方法を決定しますLANG。これらのいずれかが cron 環境で別のエンコーディングに設定されている可能性が高いと思われます。

その場合、ファイル名は別のエンコーディングを使用して Unicode にデコードされているため、UTF-8 または ASCII にエンコードできないファイル名になります。

LC_CTYPE時間エントリの前の行に単独で、または実行するコマンドの一部として、cron 定義で変数を設定するだけです。

LC_CTYPE="en_US.UTF-8"
* * * * * yourscriptcommand.py

Python Unicode の問題と同様に、答えはUnicode HOWTO の filenames セクションにあります。

于 2012-07-31T08:04:12.613 に答える
2

中国語用

export LANG="zh_CN.utf-8"                                                                            
export LC_CTYPE="zh_CN.utf-8"                                                                        
export PYTHONIOENCODING="utf-8"                                                                      

/export/zhangys/python3.5.2/bin/python3 diff_reporter.py > /home/admin/diff_script/cron_job.log 2>&1 
于 2016-10-14T06:35:51.683 に答える