[Python] 執行 python 檔案出現奇怪的 env: python\r: No such file or directory 訊息
自己有個常用的 python script,平常都是用 python run.py 的方式在執行它,
今天想說這個 python 檔有在路徑 $PATH 裡面,而且也加了 x (執行) 的屬性,
就想說直接打 run.py 來跑跑看,首先出現了一些奇怪的錯誤:
testuser@localhost ~ $ run.py /Users/testuser/run.py: line 1: import: command not found /Users/testuser/run.py: line 2: import: command not found /Users/testuser/run.py: line 3: import: command not found from: can't read /var/mail/optparse : command not found /Users/testuser/run.py: line 5: from: can't read /var/mail/__init__ : command not found /Users/testuser/run.py: line 7: /Users/testuser/run.py: line 8: syntax error near unexpected token `('
嗯… 雖然錯誤訊息看起來很奇怪,不過應該是因為沒有加 #! 的關係,
所以 Mac/Linux 會用 bash 來執行這個 python script…
在最前面加上 #!/usr/bin/env python 之後再執行,結果又變了:
testuser@localhost ~ $ run.py env: python\r: No such file or directory
這個 python\r 是什麼東西?還真是一點頭緒都沒有…
直接執行 /usr/bin/env python 看起來又很正常:
testuser@localhost ~ $ /usr/bin/env python Python 2.7.11 (default, Dec 22 2015, 10:50:41) [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
到底是怎麼一回事呢?
上網查了一下,原來是因為我的 python 檔案一開始是在 Windows 上寫的,
所以 line ending 是 CRLF,這會導致 env 會把 CR (0d) 也當作是參數的一部分,
因此就變成 python + 0d 也就是 python\r 了~
用 hexdump 看一下就很清楚,python 後面有 0d 0a:
testuser@localhost ~ $ hexdump -C /Users/testuser/run.py 00000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 |#!/usr/bin/env p| 00000010 79 74 68 6f 6e 0d 0a 0d 0a 69 6d 70 6f 72 74 20 |ython....import | 00000020 6f 73 0d 0a 69 6d 70 6f 72 74 20 73 68 75 74 69 |os..import shuti| 00000030 6c 0d 0a 69 6d 70 6f 72 74 20 75 72 6c 6c 69 62 |l..import urllib| 00000040 0d 0a 66 72 6f 6d 20 6f 70 74 70 61 72 73 65 20 |..from optparse |
解決方法就是把所有的 CRLF (0d 0a) 都換成 LF (0a),
一般來說在編輯器裡面可以將 line ending 設成 Unix 來達到,
例如我常用的 Sublime Text 可以選擇 View > Line Endings > Unix,
改好後再存檔,再看一次 hexdump 的結果,
果然 CRLF (0d 0a) 都被換成 LF (0a) 了:
testuser@localhost ~ $ hexdump -C /Users/testuser/run.py 00000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 |#!/usr/bin/env p| 00000010 79 74 68 6f 6e 0a 0a 69 6d 70 6f 72 74 20 6f 73 |ython..import os| 00000020 0a 69 6d 70 6f 72 74 20 73 68 75 74 69 6c 0a 69 |.import shutil.i| 00000030 6d 70 6f 72 74 20 75 72 6c 6c 69 62 0a 66 72 6f |mport urllib.fro| 00000040 6d 20 6f 70 74 70 61 72 73 65 20 69 6d 70 6f 72 |m optparse impor|
再執行一次 run.py,一切都很正常了:
testuser@localhost ~ $ run.py Usage: run.py [options]
參考資料:stackoverflow: env: python\r: No such file or directory
(本頁面已被瀏覽過 2,845 次)