首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python -m <filename> <encoding>?

python -m <filename> <encoding>?
EN

Stack Overflow用户
提问于 2015-12-13 13:24:55
回答 1查看 159关注 0票数 0

如何在将python脚本作为模块运行时指定编码?

例如,我想以python -m my_script -utf8的形式运行python -m my_script -utf8。但没有这样的选择。相反,我应该在文件的顶部为my_script.py提供编码。一些python-2.7包也失败了。

考虑下一种情况:

my_script.py:

代码语言:javascript
复制
# coding=utf-8
from pyglet.gl import *
  1. $ cd ~/Documents
  2. 创建非ascii文件夹:$ mkdir вафля
  3. $ cd вафля
  4. 用上面的代码创建my_script.py
  5. python my_script.py --工作得很好
  6. python -m my_script --失败

工作站:Ubuntu14.04.3 x64 +Python2.7.6 x64 (内置)

不要建议我打开Python3.4,因为我已经这么做了,只想同时支持2.7和3.4版本的Python。

增加了追踪。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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行):

代码语言:javascript
复制
        if caption is None:
            caption = sys.argv[0]

至:

代码语言:javascript
复制
        if caption is None:
            caption = sys.argv[0].decode("utf8")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34251552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档