python文件#!/usr/bin/env: 的錯誤No such file or directory


轉載:http://besteam.im/blogs/article/31/
在把windows下的一個python腳本挪到linux下的時候,出現了一個奇怪的問題,就是標題那樣的報錯,很明顯,shell沒有用對應的python解釋器去解釋腳本,而是直接用shell解釋了,下面就直接導致了一系列奇奇怪怪的報錯。看了下面這篇文章還是讓人略有啟發的

$ cat fish.py #!/usr/bin/env python print "fish" $ chmod u+x fish.py $ ./fish.py : No such file or directory

找不到文件?可是無論怎么修改腳本,都沒辦法解決。找不到文件,那應該是第一行的env命令有問題啰?真是讓人讓人摸不着腦袋,其實這是因為換行符的問題。

我們知道,linux下的文本文件以ascii碼為10的字符表示換行。而windows下則使用連續的13和10兩個字符。在python和c語言里使用\r代表ascii符為13的字符,叫做回車符,而\n代表ascii碼為10的字符,叫做換行符。對於:

#!/usr/bin/env python\r\n

這樣一行文本,windows下的程序會認為#!/usr/bin/env python就是一行。而linux呢,則會認為#! /usr/bin/env python\r是一行。於是,剛才的錯誤就出來了,因為根本沒有python\r這個文件嘛。

有個比較奇怪的地方,仔細想想,env如果出錯的話應該是報這樣的錯誤信息的:

/usr/bin/env: python : No such file or directory   (python后面有一個回車符)

那為什么現在是:

: No such file or directory

這主要是因為\r這個字符的緣故。在linux終端下,輸出\r會什么都不顯示,只是把光標移到行首。看看我用python取得env輸出的出錯信息:

/usr/bin/env: python\r: No such file or directory

於是終端雖然輸出了/usr/bin/env: python,但是碰到\r后,光標會被移到行首,接着輸出了:No such file or directory把前面的覆蓋掉了。於是我們就看到那個莫名其妙的出錯信息了。

可能有人會怪windows怎么那么傻,一個\n不就可以了,為什么要用\r\n呢,給我們造成了多大的麻煩。其實這也不能怪windows。使用\r\n的歷史可以追溯到遙遠的19世紀。 那時候發明的打字機主要結構是一個實心圓筒+排列成菊花狀的字模。紙張被牢牢地固定在圓筒的表面上。當我們按下一個字母的時候,機械裝置引動字模"飛"向紙張,同時圓筒前的色帶升起,用力地印下去,於是紙張上面就出現一個字了。印完之后,機械裝置自動地讓圓筒向左移動一個字母格子,方便打印下一個字符。打完一行之后,左手邊上有一個搖桿,搖一下,圓筒就可以滾動一個行距,這是換行。不過,因為打字的時候圓筒總會不斷地向左移動,所以打字員還需要用力地把圓筒推回右邊,這就是傳說中的回車了。在計算機里常見的換行操作在打字機里需要換行+回車兩個操作。自然,計算機里不用這么麻煩,不過windows喜歡看起來更兼容一點。於是換行就成了\r\n了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM