如何在将python脚本作为模块运行时指定编码?
例如,我想以python -m my_script -utf8的形式运行python -m my_script -utf8。但没有这样的选择。相反,我应该在文件的顶部为my_script.py提供编码。一些python-2.7包也失败了。
考虑下一种情况:
my_script.py:
# coding=utf-8
from pyglet.gl import *$ cd ~/Documents$ mkdir вафля$ cd вафляmy_script.pypython my_script.py --工作得很好python -m my_script --失败工作站:Ubuntu14.04.3 x64 +Python2.7.6 x64 (内置)
不要建议我打开Python3.4,因为我已经这么做了,只想同时支持2.7和3.4版本的Python。
增加了追踪。
File "my_script.py", line 22, in <module>
from pyglet.gl import *
File "/usr/local/lib/python2.7/dist-packages/pyglet/gl/__init__.py", line 236, in <module>
import pyglet.window
File "/usr/local/lib/python2.7/dist-packages/pyglet/window/__init__.py", line 1817, in <module>
gl._create_shadow_window()
File "/usr/local/lib/python2.7/dist-packages/pyglet/gl/__init__.py", line 205, in _create_shadow_window
_shadow_window = Window(width=1, height=1, visible=False)
File "/usr/local/lib/python2.7/dist-packages/pyglet/window/xlib/__init__.py", line 163, in __init__
super(XlibWindow, self).__init__(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pyglet/window/__init__.py", line 559, in __init__
self._create()
File "/usr/local/lib/python2.7/dist-packages/pyglet/window/xlib/__init__.py", line 353, in _create
self.set_caption(self._caption)
File "/usr/local/lib/python2.7/dist-packages/pyglet/window/xlib/__init__.py", line 511, in set_caption
self._set_text_property('WM_NAME', caption, allow_utf8=False)
File "/usr/local/lib/python2.7/dist-packages/pyglet/window/xlib/__init__.py", line 785, in _set_text_property
buf = create_string_buffer(value.encode('ascii', 'ignore'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 19: ordinal not in range(128)发布于 2015-12-13 18:13:14
这似乎是pyglet中的一个bug。它使用sys.argv[0]作为它的默认窗口标题,但是它期望标题字符串是一个unicode实例,它以后可以将它的encode转换为ASCII (忽略不可表示的unicode值)。但是,在Python2中,sys.argv[0]将是某些编码中的字节串( str实例)(我不确定指定的编码是在任何地方指定的,还是在不同的文件系统中可能有所不同)。当您尝试使用已编码的字节串时,Python2首先尝试使用encode编解码器将字符串解码为unicode对象,然后再按请求进行编码。
您只在使用-m标志时才会看到这个bug,因为只有在这种情况下(您测试的方式)才是sys.argv[0]中包含的路径的非ASCII部分。当您调用python my_script.py时,sys.argv[0]是"my_script.py"。当您使用-m时,sys.argv[0]将是脚本文件(包括非ASCII文件夹)的绝对路径。
我不确定正确的修复是什么,因为正如我前面提到的,我不确定sys.argv使用的编码是否在Python2中得到了很好的指定。如果您只想为您的系统修复这个问题,您可能只需在pyglet/window/__init__.py中更改这些行(它们应该大致为555-556行):
if caption is None:
caption = sys.argv[0]至:
if caption is None:
caption = sys.argv[0].decode("utf8")https://stackoverflow.com/questions/34251552
复制相似问题