我面临着ArcPy和Python编码之间的奇怪行为。我使用VisualStudio 2010 Shell,安装了Python tools for VS(PTVS)。我通过一个简单的脚本文件隔离了我的问题。包含以下命令的py脚本文件。在VisualStudio中,我将“高级保存选项…”设置为“无签名的UTF-8”。脚本只需在屏幕上打印一个重音字符串,然后导入arcpy模块,然后再次打印相同的字符串。导入Arcpy似乎改变了Python编码设置,但我不知道为什么,我想正确地重新启动它,因为它在原始脚本中的任何地方都会导致一些问题。
我检查了python“encoding”文件夹并删除了每个pyc文件。然后运行脚本并生成3个pyc文件:
cp850.pyc(对应于我的stdout.encoding)
cp1252.pyc(对应于我的Windows环境编码)
utf_8.pyc(适合我的脚本编码)
当ArcPy被导入时,一些东西会改变影响初始变量的编码。
为什么?
有没有可能用一些Python命令找到ArcPy encode cp1252的位置并读取它,这样我就可以创建一个处理它的函数?
# -*- coding: utf-8 -*-
import sys
print ('Loaded encoding : %(t)s'%{'t':sys.getdefaultencoding()})
reload(sys) # See stackoverflow question 2276200
sys.setdefaultencoding('utf-8')
print ('Set default encoding : %(t)s'%{'t':sys.getdefaultencoding()})
print ''
texte = u'Récuperation des données'
print ('Original type : %(t)s'%{'t':type(texte)})
print ('Original text : %(t)s'%{'t':texte})
print ''
import arcpy
print ('imported arcpy')
print ('Loaded encoding : %(t)s'%{'t':sys.getdefaultencoding()})
print ''
print ('arcpy mess up original type : %(t)s'%{'t':type(texte)})
print ('arcpy mess up original text : %(t)s'%{'t':texte})
print ''
print ('arcpy mess up reencoded with cp1252 type : %(t)s'%{'t':type(texte.encode('cp1252'))})
print ('arcpy mess up reencoded with cp1252 text : %(t)s'%{'t':texte.encode('cp1252')})
raw_input()
当我运行脚本时,会得到以下结果:
加载的编码:ascii
设置编码:utf-8
原始类型:键入“unicode”
原文:Récuperation des données导入arcpy
加载的编码:utf-8
arcpy混乱原始类型:“unicode”类型
arcpy搞乱原文:R'cuperation des donn'es>使用cp1252类型的arcpy混乱重入代码:类型'str'
用cp1252重新编码:Récuperation des données>
最佳答案
回答我的问题。
从ESRI的支持人员那里,我得到了以下信息:
默认情况下,命令行中的python不会将代码页更改为基于UTF-8的文本,以便打印语句以Unicode显示。另一方面,ArcGIS特别允许将unicode值传递给它,并且已经在命令行中更改了代码页,这样您看到的打印值就是ArcGIS正在使用的值。这就是为什么命令行应该是您看到import sys后跟import arcpy为您提供不同打印值的唯一环境。
由于我的应用程序运行的脚本并不总是需要arcpy(取决于我希望它做什么)来解决我的问题,所以我使用以下提供的信息创建了一个通用函数来处理编码(无论是否导入了arcpy):
Coding_CMD_Window = sys.stdout.encoding
Coding_OS = locale.getpreferredencoding()
Coding_Script = sys.getdefaultencoding()
Coding2Use = Coding_CMD_Window
if any('arcpy' in importedmodules for importedmodules in sys.modules):
Coding2Use = Coding_OS
另外,我还确保我的所有脚本都使用了正确的UTF-8编码,而没有签名。
希望这对任何人都有帮助。
关于python - ArcPy和Python编码搞乱了吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19525319/