Python3:UnicodeEncodeError仅当从crontab运行时

Python3:UnicodeEncodeError仅当从crontab运行时,python,python-3.x,python-unicode,Python,Python 3.x,Python Unicode,第一篇文章,所以请友好,我已经搜索了很多,但我发现的大多数东西都与Python2有关 我有一个Python3脚本,它可以从文件列表构建一个zip文件;只有在从crontab运行脚本时,UnicodeEncodeError才会失败,但在从交互式控制台运行时,它可以完美地工作。 我想环境中一定有什么东西,但我就是不知道是什么 这是代码摘录: def zipFileList(self, rootfolder, filelist, zip_file, logger): count = 0

第一篇文章,所以请友好,我已经搜索了很多,但我发现的大多数东西都与Python2有关

我有一个Python3脚本,它可以从文件列表构建一个zip文件;只有在从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-3109:10:03033:根-错误-回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.2/zipfile.py”,第365行,在_encodeFilenameFlags中
返回self.filename.encode('ascii'),self.flag_位
UnicodeEncodeError:“ascii”编解码器无法对位置56-57中的字符进行编码:序号不在范围内(128)
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“XBE.py”,第45行,主
pam.executeList(记录器)
文件“/home/vte/vtebackup/vte41/scripts/ptActivityManager.py”,执行列表第62行
self.executeActivity(act、记录器)
文件“/home/vte/vtebackup/vte41/scripts/ptActivityManager.py”,第71行,在executeActivity中
self.exAct\u文件备份(act、记录器)
文件“/home/vte/vtebackup/vte41/scripts/ptActivityManager.py”,第112行,精确文件备份
zipFileList(srcfolder、filelist、arcfilename、logger)
zipFileList中第143行的文件“/home/vte/vtebackup/vte41/scripts/ptFileManager.py”
write(os.path.join(rootfolder,curfile),curfile,zipfile.zip_DEFLATED)
写入文件“/usr/local/lib/python3.2/zipfile.py”,第1115行
self.fp.write(zinfo.FileHeader())
文件“/usr/local/lib/python3.2/zipfile.py”,第355行,在文件头中
filename,flag_bits=self.\u encodeFilenameFlags()
文件“/usr/local/lib/python3.2/zipfile.py”,第367行,在_encodeFilenameFlags中
返回self.filename.encode('utf-8'),self.flag_位| 0x800
UnicodeEncodeError:“utf-8”编解码器无法对位置56中的字符“\udcc3”进行编码:不允许使用代理
这是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
操作系统是UbuntuLinuxLTS10.04,Python版本3.2(与其他Python版本一起安装为altinstall)。 所有Python源文件都有这个shebang

#!/usr/bin/env python3.2
作为第一行


您能帮我找出问题所在以及如何解决此问题吗?

一名团队成员在一份报告中找到了解决方案

通过在脚本命令前添加LANG指令,解决了此问题:

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

我希望这对其他人有用,因为我有一段时间对这件事感到困惑:)

检查您的区域设置。在交互式控制台上,运行命令
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”
Python根据
LC_CTYPE
LANG
环境变量确定如何解释文件名,我强烈怀疑其中一个在您的cron环境中设置为不同的编码

如果是这种情况,您的文件名将使用不同的编码被解码为unicode,这将导致无法编码为UTF-8或ASCII的文件名

只需在您的cron定义中设置
LC\u CTYPE
变量,或者在时间条目前面的一行上,或者作为要执行的命令的一部分:

LC_CTYPE=“en_US.UTF-8” *****yourscriptcommand.py 与python Unicode问题一样,答案在于中文的。

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 

由于未知原因,当zipfile尝试对文件名进行编码以将信息嵌入其中时,文件名有一个错误。可能是操作系统的问题?你能在你的脚本中记录
curfile
吗?谢谢这救了我的命。在MacOS X上
import sys print(sys.getdefaultencoding())
cron作业显示
utf-8
,但我还是得到了提到的错误,这个解决方案解决了我的问题。