Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么不在py脚本中使用sys.setdefaultencoding(“utf-8”)呢?_Python_Encoding_Utf 8_Python 2.x_Sys - Fatal编程技术网

Python 为什么不在py脚本中使用sys.setdefaultencoding(“utf-8”)呢?

Python 为什么不在py脚本中使用sys.setdefaultencoding(“utf-8”)呢?,python,encoding,utf-8,python-2.x,sys,Python,Encoding,Utf 8,Python 2.x,Sys,我看到很少有py脚本在脚本的顶部使用这个。在什么情况下应该使用它 import sys reload(sys) sys.setdefaultencoding("utf-8") import sys if (sys.stdout.encoding is None): print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOEN

我看到很少有py脚本在脚本的顶部使用这个。在什么情况下应该使用它

import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)

根据文档:这允许您从默认ASCII切换到其他编码,如UTF-8,Python运行时在需要将字符串缓冲区解码为unicode时将使用UTF-8

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
只有在Python启动时,当Python扫描环境时,此函数才可用。必须在系统范围的模块中调用它,
sitecustomize.py
,对该模块求值后,从
sys
模块中删除
setdefaultencoding()
函数

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
实际使用它的唯一方法是通过重新加载将属性带回来

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
另外,一直不鼓励使用
sys.setdefaultencoding()
,并且在py3k中它已成为一个禁忌。py3k的编码硬连接到“utf-8”,更改它会导致错误

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
我建议一些阅读指南:

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)

所以,用同样的例子:

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
export PYTHONIOENCODING=UTF-8
./test.py > output.txt
将工作

tl;博士
import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
答案是永远不要!(除非你真的知道自己在做什么)

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
在正确理解编码/解码的情况下,可以解决9/10次问题

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
1/10的人的区域设置或环境定义不正确,需要设置:

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
PYTHONIOENCODING="UTF-8"  
在他们的环境中修复控制台打印问题

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
它有什么作用?
sys.setdefaultencoding(“utf-8”)
(贯穿以避免重复使用)更改Python 2.x需要将Unicode()转换为str()时使用的默认编码/解码(反之亦然),并且不提供编码。即:

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
str(u"\u20AC")
unicode("€")
"{}".format(u"\u20AC") 
在Python2.x中,默认编码设置为ASCII,上述示例将失败:

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
(我的控制台配置为UTF-8,因此
“€”='\xe2\x82\xac'
,因此
\xe2
出现异常)

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
sys.setdefaultencoding(“utf-8”)
将允许这些功能适用于me,但不一定适用于不使用utf-8的人ASCII的默认值确保编码假设不会被烘焙到代码中

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
安慰
sys.setdefaultencoding(“utf-8”)
还有一个副作用,即在控制台打印字符时,会出现修复
sys.stdout.encoding
。Python使用用户的区域设置(Linux/OSX/Un*X)或代码页(Windows)来设置此设置。有时,用户的区域设置被破坏,只需要
pythoniocodeding
来修复控制台编码

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
例如:

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
$export LANG=en_GB.胡言乱语
$python
>>>导入系统
>>>sys.stdout.encoding
“ANSI_X3.4-1968”
>>>打印u“\u20AC”
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
UnicodeEncodeError:“ascii”编解码器无法对位置0中的字符u'\u20ac'进行编码:序号不在范围内(128)
>>>退出()
$PythonionEncoding=UTF-8 python
>>>导入系统
>>>sys.stdout.encoding
“UTF-8”
>>>打印u“\u20AC”
€
sys.setdefaultencoding(“utf-8”)有什么不好? 16年来,人们一直在开发Python2.x,因为他们知道默认编码是ASCII
UnicodeError
已编写异常处理方法来处理发现包含非ASCII的字符串上的字符串到Unicode的转换

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
在设置defaultencoding之前,此代码将无法解码ascii编码中的“Å”,然后将输入异常处理程序猜测编码并正确地将其转换为unicode。印刷:Angstrom(Å®)经营您的业务。一旦您将defaultencoding设置为utf-8,代码将发现字节字符串可以解释为utf-8,因此它将破坏数据并返回以下内容:Angstrom(Ů)运行您的业务

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
更改应为常数的内容将对您所依赖的模块产生显著影响。最好只修复代码中进出的数据。

import sys
if (sys.stdout.encoding is None):            
    print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
    exit(1)
示例问题 虽然将defaultencoding设置为UTF-8不是以下示例中的根本原因,但它显示了问题是如何被掩盖的,以及当输入编码更改时,代码是如何以不明显的方式中断的:

    import sys
    if (sys.stdout.encoding is None):            
        print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
        exit(1)
    
  • 第一个危险在于
    重新加载(系统)

    import sys
    if (sys.stdout.encoding is None):            
        print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
        exit(1)
    
    当您重新加载一个模块时,您实际上会在运行时获得该模块的两个副本。旧模块与其他模块一样是Python对象,只要有对它的引用,它就会保持活动状态。因此,一半的对象将指向旧模块,另一半指向新模块。当您进行一些更改时,如果某个随机对象没有看到更改,您将永远看不到更改:

    import sys
    if (sys.stdout.encoding is None):            
        print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
        exit(1)
    
    (This is IPython shell)
    
    In [1]: import sys
    
    In [2]: sys.stdout
    Out[2]: <colorama.ansitowin32.StreamWrapper at 0x3a2aac8>
    
    In [3]: reload(sys)
    <module 'sys' (built-in)>
    
    In [4]: sys.stdout
    Out[4]: <open file '<stdout>', mode 'w' at 0x00000000022E20C0>
    
    In [11]: import IPython.terminal
    
    In [14]: IPython.terminal.interactiveshell.sys.stdout
    Out[14]: <colorama.ansitowin32.StreamWrapper at 0x3a9aac8>
    
    (这是IPython shell)
    在[1]中:导入系统
    在[2]中:sys.stdout
    出[2]:
    在[3]中:重新加载(系统)
    在[4]中:sys.stdout
    出[4]:
    在[11]中:导入IPython.terminal
    在[14]中:IPython.terminal.interactiveshell.sys.stdout
    出[14]:
    
  • 现在,
    sys.setdefaultencoding()
    property

    import sys
    if (sys.stdout.encoding is None):            
        print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
        exit(1)
    
    。现在,
    utf-8
    是地球上最健全的编码(向后兼容ASCII和所有编码),转换现在“正常工作”有什么可能出错?

    import sys
    if (sys.stdout.encoding is None):            
        print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
        exit(1)
    
    嗯,什么都行。这就是危险所在。

    import sys
    if (sys.stdout.encoding is None):            
        print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." 
        exit(1)
    
    • 可能有一些代码依赖于为非ASCII输入抛出的
      UnicodeError
      ,或者使用错误处理程序进行代码转换,这会产生意外的结果。而且由于所有代码都是使用默认设置测试的,因此您在这里严格处于“不受支持”的范围内,并且没有人向您保证他们的代码将如何运行
    • 如果不是系统上的所有设备都使用UTF-8,则转码可能会产生意外或不可用的结果。(请记住,程序必须在客户的设备上为客户工作。)
      • 再说一次,最糟糕的事情是你永远不会知道b