设为首页 收藏本站
查看: 884|回复: 0

[经验分享] 【转】关于Python脚本开头两行的:#!/usr/bin/python和#

[复制链接]

尚未签到

发表于 2015-12-2 15:37:39 | 显示全部楼层 |阅读模式
  原文网址:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/
#!/usr/bin/python
  是用来说明脚本语言是python的
  是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。
  
# -*- coding: utf-8 -*-
  是用来指定文件编码为utf-8的
  详情可以参考:
  PEP 0263 — Defining Python Source Code Encodings
  
  在此,详细的(主要是翻译)解释一下,为何要加这个编码声明,以及如何添加编码声明:
  
使用文件编码声明以前所遇到的问题
  Python 2.1中,想要输入Unicode字符,只能用基于Latin-1的"unicode-escape"的方式输入 -> 对于其他非Latin-1的国家和用户,想要输入Unicode字符,就显得很繁琐,不方便。
  希望是:
  编程人员,根据自己的喜好和需要,以任意编码方式输入字符串,都可以,这样才正常。
  
建议选用的方案
  所以,才有人给Python官方建议,所以才有此PEP 0263。
  此建议就是:
  允许在Python文件中,通过文件开始处的,放在注释中的,字符串形式的,声明,声明自己的python文件,用何种编码。
  由此,需要很多地方做相应的改动,尤其是Python文件的解析器,可以识别此种文件编码声明。
  
具体如何声明python文件编码?
  上面已经说了,是,文件开始处的,放在注释中的,字符串形式的,声明。
  那具体如何声明,以什么样的格式去声明呢?
  其实就是,你之前就见过的,这种:



?

1


# -*- coding: utf-8 -*-
  对此格式的详细解释是:

    • 如果没有此文件编码类型的声明,则python默认以ASCII编码去处理

      • 如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的python文件,自然就会报错了。

    • 必须放在python文件的第一行或第二行
    • 支持的格式,可以有三种:

      • 带等于号的:


        ?

        1


        # coding=<encoding name>

      • 最常见的,带冒号的(大多数编辑器都可以正确识别的):


        ?

        1
        2


        #!/usr/bin/python
        # -*- coding: <encoding name> -*-

      • vim的:


        ?

        1
        2


        #!/usr/bin/python
        # vim: set fileencoding=<encoding name> :


    • 更加精确的解释是:

      • 符合正则表达式:


        ?

        1


        "coding[:=]\s*([-\w.]+)"

      • 的都可以,很明显,如果你熟悉正则表达式,也就可以写出来,其他一些合法的编码声明,以utf-8为例,比如:





?

1
2
3
4
5


coding:         utf-8
coding=utf-8
coding=                  utf-8
encoding:utf-8
crifanEncoding=utf-8

  • 为了照顾特殊的Windows中的带BOM(’\xef\xbb\xbf’)的UTF-8:

    • 如果你的python文件本身编码是带BOM的UTF-8,即文件前三个字节是:’\xef\xbb\xbf’,那么:

      • 即使你没有声明文件编码,也自动当做是UTF-8的编码
      • 如果你声明了文件编码,则必须是声明了(和你文件编码本身相一致的)UTF-8

        • 否则(由于声明的编码和实际编码不一致,自然)会报错



  
文件编码声明的各种例子
  针对上面的规则,下面给出各种,合法的,非法的,例子,供参考:
合法的python文件编码声明

  • 带声明了解释器的,Emacs风格的,(注释中的)文件编码声明

    • 例子1:


      ?

      1
      2
      3
      4


      #!/usr/bin/python
      # -*- coding: latin-1 -*-
      import os, sys
      ...

    • 例子2:


      ?

      1
      2
      3
      4


      #!/usr/bin/python
      # -*- coding: iso-8859-15 -*-
      import os, sys
      ...

    • 例子3:


      ?

      1
      2
      3
      4


      #!/usr/bin/python
      # -*- coding: ascii -*-
      import os, sys
      ...


  • 不带声明了解释器的,直接用纯文本形式的:


    ?

    1
    2
    3


    # This Python file uses the following encoding: utf-8
    import os, sys
    ...

  • 文本编辑器也可以有多种(其他的)定义编码的方式:


    ?

    1
    2
    3
    4


    #!/usr/local/bin/python
    # coding: latin-1
    import os, sys
    ...


    • 很明显,其中的没用-*-,直接用了coding加上编码值

  • 不带编码声明的,默认当做ASCII处理:


    ?

    1
    2
    3


    #!/usr/local/bin/python
    import os, sys
    ...

非法的python文件编码声明举例

  • 少了coding:前缀


    ?

    1
    2
    3
    4


    #!/usr/local/bin/python
    # latin-1
    import os, sys
    ...

  • 编码声明不在第一行或第二行:


    ?

    1
    2
    3
    4
    5


    #!/usr/local/bin/python
    #
    # -*- coding: latin-1 -*-
    import os, sys
    ...

  • 不支持的,非法的字符编码(字符串)声明:


    ?

    1
    2
    3
    4


    #!/usr/local/bin/python
    # -*- coding: utf-42 -*-
    import os, sys
    ...

  
python文件编码声明所遵循的理念
  1.单个的完整的python源码文件中,只用单一的编码。
  ->
  不允许嵌入了多种的编码的数据
  否则会导致(python解释器去解析你的python文件时)报编码错误。
  
  不太懂这段:
Any encoding which allows processing the first two lines in the way indicated above is allowed as source code encoding, this includes ASCII compatible encodings as well as certain multi-byte encodings such as Shift_JIS. It does not include encodings which use two or more bytes for all characters like e.g. UTF-16. The reason for this is to keep the encoding detection algorithm in the tokenizer simple.
  
  2.这段也不太懂:
Handling of escape sequences should continue to work as it does now, but with all possible source code encodings, that is standard string literals (both 8-bit and Unicode) are subject to escape sequence expansion while raw string literals only expand a very small subset of escape sequences.
  
  3.Python的分词器+编译器,会按照如下的逻辑去工作:

  • 读取文件
  • 不同的文件,根据其声明的编码去解析为Unicode
  • 转换为UTF-8字符串
  • 针对UTF-8字符串,去分词
  • 编译之,创建Unicode对象
  要注意的是:
  Python中的标识符,都是ASCII的。
  
  其余的内容,不翻译了。
  至此,已经解释的够清楚了。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146467-1-1.html 上篇帖子: Depoly Ubuntu+Apache2.4+Python+Django 下篇帖子: python定时执行任务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表