首页 > 代码库 > "#!/usr/bin/python: No such file or director"引发的编码问题

"#!/usr/bin/python: No such file or director"引发的编码问题

问题描述

  我自己写了一个Python脚本,在Linux服务器和我的Mac上运行都报错:

./build_system.py: line 1: #!/usr/bin/python: No such file or directory

  在网上搜索了半天,发现都说都问题原因是第一行尾部写入了Windows都回车“\r\n”,导致解析成了“python\r”而不是“python”,因而报错是“: No such file or directory”(\n符号导致了行开始,覆盖了原来都内容)。从网上都这个解释来看,跟我都这个问题现象不是一样的。更何况,我手动删除第一行,在Linux环境下重写了一遍,还是一样的报错,因此可以证明我遇到的问题并非是“\r\n”引起的。

问题分析

  我认为一定是有不可见字符导致的问题。于是,我用Linux命令diff找一个可以运行的Python脚本来对比下头部:

$ diff ../../unibuild/unibuild.py build_system.py | more
1c1
< #!/usr/bin/python
---
> <U+FEFF>#!/usr/bin/python

  果然不出所料,不能运行的脚本文件开头,多了一个不可见内容<U+FEFE>,搜索这个字符发现了问题原因。

问题原因

  引用网友的描述:

   有些编辑器,比如M$ Windows的记事本,在创建UTF8编码文件时会在头部添加一个不可见字符。这个字符可以通过vim查看到,而且如果是一个php文件,php4、php5在解析时均会有输出。
   原来这个被称作BOM(Byte Order Mark)的不可见字符,是Unicode用来标识内部编码的排列方式的,在UTF-16、UTF-32编码里它是必需的,而在UTF-8里是可选的。因此,才会出现有的编辑器在文件头部添加添加BOM、而有的语法解析器又不作处理的的混乱情况。
   根据w3c里FAQ的建议,解决方法就是,删无赦

  请参考:UTF-8编码中BOM的检测与删除

问题解决

  用vi编辑器打开出问题的文件,输入如下指令:

:set nobomb        #删除UTF-8 BOM字符

  反之,如果是保留UTF-8 BOM则输入“:set bomb”.

"#!/usr/bin/python: No such file or director"引发的编码问题