Python脚本开头两行:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
转于:https://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/
出处:在路上
一、基本功能
1)#!/usr/bin/python
作用:用来说明脚本语言是python,要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。
2)# -*- coding: utf-8 -*-
作用:用来指定文件编码为utf-8
详情可以参考:PEP 0263 — Defining Python Source Code Encodings
二、为何要加这个编码声明,以及如何添加编码声明?
1)使用文件编码声明以前所遇到的问题
Python 中,想要输入Unicode字符,只能用基于Latin-1的"unicode-escape"的方式输入 -> 对于其他非Latin-1的国家和用户,想要输入Unicode字符,就显得很繁琐,不方便。
希望:编程人员,根据自己的喜好和需要,以任意编码方式输入字符串,都可以,这样才正常。
2)建议选用的方案
给Python官方建议,所以才有此PEP 0263
此建议就是:允许在Python文件中,通过文件开始处的,放在注释中的,字符串形式的,声明,声明自己的python文件,用何种编码。由此,需要很多地方做相应的改动,尤其是Python文件的解析器,可以识别此种文件编码声明。
三、具体如何声明python文件编码?
#上面已经说了,是,文件开始处的,放在注释中的,字符串形式的,声明。
1)注意事项
|
1
|
# -*- coding: utf-8 -*- |
对此格式的详细解释是:
A、如果没有此文件编码类型的声明,则python默认以ASCII编码去处理
B、如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的python文件,自然就会报错了。
C、必须放在python文件的第一行或第二行
2)支持的格式,可以有三种:
A、带等于号的:
|
1
|
# coding=<encoding name> |
B、最常见的,带冒号的(大多数编辑器都可以正确识别的):
|
1
2
|
#!/usr/bin/python# -*- coding: <encoding name> -*- |
C、vim的:
|
1
2
|
#!/usr/bin/python# vim: set fileencoding=<encoding name> : |
#更加精确的解释是,符合正则表达式:
|
1
|
"coding[:=]\s*([-\w.]+)" |
==>如果你熟悉正则表达式,也就可以写出来,其他一些合法的编码声明,以utf-8为例,比如:
|
1
2
3
4
5
|
coding: utf-8coding=utf-8coding= utf-8encoding:utf-8crifanEncoding=utf-8 |
3)Windows中的带BOM(’\xef\xbb\xbf’)的UTF-8:
如果你的python文件本身编码是带BOM的UTF-8,即文件前三个字节是:’\xef\xbb\xbf’,那么:
A、即使你没有声明文件编码,也自动当做是UTF-8的编码;
B、如果你声明了文件编码,则必须是声明了(和你文件编码本身相一致的)UTF-8,否则(由于声明的编码和实际编码不一致,自然)会报错
四、文件编码声明的各种例子
1)合法的python文件编码声明
A、带声明了解释器的,Emacs风格的,(注释中的)文件编码声明
例1:
|
1
2
3
4
|
#!/usr/bin/python# -*- coding: latin-1 -*-importos, sys... |
例2:
|
1
2
3
4
|
#!/usr/bin/python# -*- coding: iso-8859-15 -*-importos, sys... |
例子3:
|
1
2
3
4
|
#!/usr/bin/python# -*- coding: ascii -*-importos, sys... |
B、不带声明了解释器的,直接用纯文本形式的:
|
1
2
3
|
# This Python file uses the following encoding: utf-8importos, sys... |
C、文本编辑器也可以有多种(其他的)定义编码的方式:
|
1
2
3
4
|
#!/usr/local/bin/python# coding: latin-1importos, sys... |
D、不带编码声明的,默认当做ASCII处理:
|
1
2
3
|
#!/usr/local/bin/pythonimportos, sys... |
2)非法的python文件编码声明举例
A、少了coding:前缀
|
1
2
3
4
|
#!/usr/local/bin/python# latin-1import os, sys... |
B、编码声明不在第一行或第二行:
|
1
2
3
4
5
|
#!/usr/local/bin/python## -*- coding: latin-1 -*-importos, sys... |
C、不支持的,非法的字符编码(字符串)声明:
|
1
2
3
4
|
#!/usr/local/bin/python# -*- coding: utf-42 -*-importos, 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. |
这段也不太懂:
| 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. |
2)Python的分词器+编译器,会按照如下的逻辑去工作:
- 读取文件
- 不同的文件,根据其声明的编码去解析为Unicode
- 转换为UTF-8字符串
- 针对UTF-8字符串,去分词
- 编译之,创建Unicode对象
3)要注意的是:
Python中的标识符,都是ASCII的。
Python脚本开头两行:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用的更多相关文章
- 关于python脚本头部设置#!/usr/bin/python
今天又是贼几把菜的一天0.0 读别人程序的时候看到在python文件头部设置签名,感觉贼几把酷,自己也试着在文件前段设置了一下. 设置还是蛮简单的,设置过程如图所示. 设置后如图所示: 当然你也可能看 ...
- 调用python脚本报错/usr/bin/env: python : No such file or directory
一.调用python脚本报错 /usr/bin/env: python: No such file or directory 二.解决方法 原因是在windows上编写的脚本,使用dos2unix对脚 ...
- Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
#!/usr/bin/Python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的 估计有不少人注意过一些python脚本开头 ...
- 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
#!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的PEP 0263 -- Defining P ...
- 【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
原文网址:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用 ...
- 【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
1.#!/usr/bin/python 是用来说明脚本语言是 python 的 是要用 /usr/bin下面的程序(工具)python,这个解释器,来解释 python 脚本,来运行 python 脚 ...
- (二)Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
#!usr/bin/env python # -*- coding: utf-8 -*- def test(): print('hello, world') if __name__ == " ...
- 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 转
#!/usr/bin/python 是用来说明脚本语言是python的 是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的. # -*- ...
- #!/usr/bin/python和#!/usr/bin/env 的区别
#!/usr/bin/python 通常在一个.py文件开头都会有这个语句 它只在Linux系统下生效,意思是当作为可执行文件运行时调用的解释器的位置上面代码的意思是调用/usr/bin/下的Pyth ...
随机推荐
- UIApplicationDelegate 各方法回调时机
本篇文章主要介绍一些UIApplicationDelegate中几个常用的回调方法的调用时机.以帮助你判断哪些方法倒底放到哪个回调中去实现. 1. – (void)applicationDidFini ...
- iOS GPUImage 滤镜介绍
这里直接引用官方描述: The GPUImage framework is a BSD-licensed iOS library that lets you apply GPU-accelerated ...
- Xen虚拟化基础篇
一.xen的简介 Xen是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达128个有完全功能的操作系统. 在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(& ...
- SQL优化小结
一 背景 客户数据库经常出现死锁.超时.查询慢等问题,数据库mssql,数据量主要表大概上千W. 二 收集信息 首先是要找出IO大.查询慢.使用频率高的脚本.直接用Profiler ...
- PAT 天梯赛 L2-016. 愿天下有情人都是失散多年的兄妹 【BFS】
题目链接 https://www.patest.cn/contests/gplt/L2-016 思路 用BFS 每层 遍历当代 并且查找当代是否有重复 有重复就跳出 然后 POP 并且将他们的下一代 ...
- iOS 发大招 otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 写法 && 编写通用类的时候关于可变参数的处理
开始 我 以为 这个 alertView 里面 ...的写法 应该 是一个 普通的数组 然 并没有 分享一篇好文 http://www.tekuba.net/program/290/ IOS实现 ...
- Data Structure Array: Move all zeroes to end of array
http://www.geeksforgeeks.org/move-zeroes-end-array/ #include <iostream> #include <vector> ...
- python核心编程3-13
3.13: 添加新功能. 将你上一个问题改造好的readNwriteTextFiles.py 增加一个新功能: 允许用户编辑一个已经存在的文本文件. 你可以使用任何方式,无论是一次编辑一行,还是一次编 ...
- 用css完成根据子元素不同书写样式
我们需要达到的效果: 需要什么 1张图片的, 2张图片的, 3张图片的样式各不相同.可以使用js完成子元素的判断,但是这里我使用css来完成 核心知识点 使用css选择器完成子元素的判断 例子: 用c ...
- 第一篇 dom
文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...