1. 程式人生 > >"#!/usr/bin/python: No such file or director"引發的編碼問題

"#!/usr/bin/python: No such file or director"引發的編碼問題

spa utf8 方法 文件頭 https span diff inux vi編輯器

問題描述

  我自己寫了一個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"引發的編碼問題