原文网址: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 -*-

对此格式的详细解释是:

  1. 如果没有此文件编码类型的声明,则python默认以ASCII编码去处理
  • 如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的python文件,自然就会报错了。

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

  1. 带等于号的:

    ?
    1
    # coding=<encoding name>
  2. 最常见的,带冒号的(大多数编辑器都可以正确识别的):
    ?
    1
    2
    #!/usr/bin/python
    # -*- coding: <encoding name> -*-

  3. 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

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

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

      1. 即使你没有声明文件编码,也自动当做是UTF-8的编码
      2. 如果你声明了文件编码,则必须是声明了(和你文件编码本身相一致的)UTF-8
        1. 否则(由于声明的编码和实际编码不一致,自然)会报错

文件编码声明的各种例子

针对上面的规则,下面给出各种,合法的,非法的,例子,供参考:

合法的python文件编码声明

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

    1. 例子1:

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

    2. 例子2:
      ?
      1
      2
      3
      4
      #!/usr/bin/python
      # -*- coding: iso-8859-15 -*-
      import os, sys
      ...

    3. 例子3:
      ?
      1
      2
      3
      4
      #!/usr/bin/python
      # -*- coding: ascii -*-
      import os, sys
      ...

  2. 不带声明了解释器的,直接用纯文本形式的:
    ?
    1
    2
    3
    # This Python file uses the following encoding: utf-8
    import os, sys
    ...

  3. 文本编辑器也可以有多种(其他的)定义编码的方式:
    ?
    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文件编码声明举例

  1. 少了coding:前缀

    ?
    1
    2
    3
    4
    #!/usr/local/bin/python
    # latin-1
    import os, sys
    ...

  2. 编码声明不在第一行或第二行:
    ?
    1
    2
    3
    4
    5
    #!/usr/local/bin/python
    #
    # -*- coding: latin-1 -*-
    import os, sys
    ...

  3. 不支持的,非法的字符编码(字符串)声明:
    ?
    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的分词器+编译器,会按照如下的逻辑去工作:

  1. 读取文件
  2. 不同的文件,根据其声明的编码去解析为Unicode
  3. 转换为UTF-8字符串
  4. 针对UTF-8字符串,去分词
  5. 编译之,创建Unicode对象

要注意的是:

Python中的标识符,都是ASCII的。

其余的内容,不翻译了。

至此,已经解释的够清楚了。

转载于:https://www.cnblogs.com/wi100sh/p/4238933.html

【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型...相关推荐

  1. 【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型...

    下面的内容来自:http://www.cnblogs.com/blueskylcc/p/5332642.html, 对方也是转的,不过没有找到转载的出处: 1.#!/usr/bin/python 是用 ...

  2. python xmxl 无法启动_/usr/bin/python: can't decompress data; zlib not available 的异常处理

    1. 问题背景 使用Pycharm连接远程服务器端pipenv虚拟环境的python解释器,运行python spark脚本时报错如下错误: 2018-09-12 23:56:00 ERROR Exe ...

  3. python中bin是什么意思_Python之一、#!/usr/bin/python到底是什么意思

    关于脚本第一行的 #!/usr/bin/python 的解释,相信很多不熟悉 Linux 系统的同学需要普及这个知识,脚本语言的第一行,只对 Linux/Unix 用户适用,用来指定本脚本用什么解释器 ...

  4. #!/usr/bin/env python与#!/usr/bin/python

    问: 最近在学习Python,有个问题向高手们求解 #!/usr/bin/env python到底有什么作用?有人说只有在UNIX类的系统下才有意义.是不是在windows下就没任何作用呢?它与#!/ ...

  5. rpmbuild告警mangling shebang in xxx from /bin/python to /usr/bin/python/python2.

    rpmbuild告警mangling shebang in xxx from #!/bin/python to #!/usr/bin/python/python2. This will become ...

  6. python脚本开头怎么写_浅谈Python脚本开头及导包注释自动添加方法

    浅谈Python脚本开头及导包注释自动添加方法 1.开头:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定 #!/usr/bin/python 是用来 ...

  7. Ubuntu执行脚本报错-bash: ./send.py: /usr/bin/python: bad interpreter: Permission denied

    在Ubuntu系统终端中,使用命令行如下命令行运行*.py文件: 执行脚本报错 root@ubuntu:/usr/bin/python# chmod a+x send.py root@ubuntu:/ ...

  8. Linux的Python文件的开头/usr/bin/env python与/usr/bin/python

    Linux的Python文件的开头/usr/bin/env python与/usr/bin/python还是有点区别的 开头为#!/usr/bin/env python 例如 dstat命令,当/us ...

  9. Python开发.py脚本文件中的#!/usr/bin/python是什么意思?

    首先要解释一下 #! 是什么吧 在Unix中,凡是被#!注释的,统统是加载器(解释器)的路径. 脚本文件头部的#!/usr/bin/python是告诉操作系统调用 /usr/bin 下的 python ...

最新文章

  1. Linux上chown命令的高级用法
  2. 利用XML实现通用WEB报表打印(转载)
  3. linux中的五大查找命令---whereis,find,locate,which,type
  4. 批量导入数据到mssql数据库的
  5. UICollectionView 具体解说学习
  6. php基础 简书,PHP入门基础
  7. coffeescript html5,HTML5——前端预处理技术(Less、Sass、CoffeeScript)
  8. 一份帮助你更好地理解深度学习的资源清单 1
  9. 微软服务器虚拟化-Hyper-v详解
  10. # CSP 201609-2 火车购票购买(100分)
  11. 中国胎儿(分娩和分娩)和新生儿护理设备行业市场供需与战略研究报告
  12. 如何写一个Linux精灵进程
  13. 约数之和(分治,公式变形)
  14. Edge(chrome内核)浏览器Linux版本初体验
  15. CefSharp中文帮助文档
  16. 英语b计算机考试时间2015年,2014年12月大学英语B 计算机应用基础考试工作安排...
  17. [导入]锐道dorado
  18. CISSP认证科普,涨姿势
  19. python实现批量图片格式转换
  20. Mysql调优(updating~)

热门文章

  1. 谈谈yii2-gii如何自定义模板
  2. 读《数学之美》第四章 谈谈分词
  3. 天空之城 matlab,[转载]matlab演奏《天空之城》代码
  4. GDB调试及其调试脚本的使用
  5. kali2.0安装搜狗输入法
  6. 中国计算机手机全部被黑,云南一高校电脑全被黑
  7. 互联网基建成果,快速实现一个clubhouse要多久
  8. 干货:产品经理怎么做才能在需求评审中少挨打?
  9. 少儿编程100讲轻松学python(六)-pycharm怎么汉化?
  10. 比亚迪定薪后多久给offer_比亚迪车主给爱车做四门隔音,没想到两年后肠子都悔青...