Python 由于UTF-8 BOM(字节顺序标记),未找到Shebang可执行文件
出于某种原因,我的一个脚本中的shebang不起作用:Python 由于UTF-8 BOM(字节顺序标记),未找到Shebang可执行文件,python,bash,Python,Bash,出于某种原因,我的一个脚本中的shebang不起作用: #!/usr/bin/env python # -*- coding: utf-8 -*- print "Hello World" 当我执行这个文件时,我得到一个错误 % ./test.py ./test.py: 1: #!/usr/bin/env: not found 我的/usr/bin/目录的内容没有问题:env和python都在那里,具有正确的执行权限。问题的原因是我的文件是使用UTF8和BOM(字节顺序标记)编码的。 删除B
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print "Hello World"
当我执行这个文件时,我得到一个错误
% ./test.py
./test.py: 1: #!/usr/bin/env: not found
我的
/usr/bin/
目录的内容没有问题:env
和python
都在那里,具有正确的执行权限。问题的原因是我的文件是使用UTF8和BOM(字节顺序标记)编码的。
删除BOM表,即使用UTF8编码文件而不使用BOM表,可以解决此问题
注意:对于记事本++用户,“不带BOM的UTF8”在编辑器中也被称为(奇怪的)“ANSI as UTF-8”。这是由于Unix和Linux处理shebang的方式。必须是文件中的前两个字节。如果您有一个BOM表,那么这不再是真的,因此会出现错误 请注意,从python解释器的角度来看,放置BOM是完全无用的,因为
#-*-coding:utf-8-*-
已经告诉python编码
AFAIK BOM通常不与utf-8一起使用。它用于UTF-16 et模拟,以指定字节顺序。如果编辑器假定编码错误,您应该能够使用正确的编码显式打开文件。事实上,根据Unicode标准,“对于UTF-8,既不要求也不建议使用BOM,但在UTF-8数据从使用BOM的其他编码形式转换或BOM用作UTF-8签名的情况下可能会遇到这种情况。“但是,对于不知情的程序员来说,使用Notepad++犯错误的风险很高,因为编辑器显示的默认UTF8编码(简称为“UTF-8”)实际上是一种使用BOM的“危险”编码。@Sebastien Notepad++是一个Windows程序。如果您想使用众所周知是封闭系统一部分的编辑器生成跨平台代码,您必须在所有配置上测试代码,因为编辑器不关心这些细节以使代码可移植。即使使用更多的开放式软件尝试跨平台,这一点也是正确的。Unicode常见问题解答中甚至提到了这一点: