在 Python 腳本的第一行經常見到這樣的注釋:
#!/usr/bin/env python3
或者
#!/usr/bin/python3
含義
在腳本中, 第一行以 #! 開頭的代碼, 在計算機行業中叫做 "shebang", 也叫做 sha-bang / hashbang / pound-bang / hash-pling, 其作用是"指定由哪個解釋器來執行腳本".
為什么要指定解釋器?
舉個例子, 很多人在系統中同時安裝了 Python2 和 Python3, 但是 2 和 3 是不兼容的, 所以執行腳本時必須指定解釋器.
再比如說, Unix 系統中一般同時安裝了多個版本的 Shell, 比如常用的 bash、sh 和 現代的 zsh, 但是這些 shell 的語法並不完全相同, 所以也需要指定解釋器.
如何指定解釋器?
一. 如果是通過命令行 (shell) 執行腳本:
-
在 "Unix -like 系統"中 (比如服務器常用的 CentOS, 或者蘋果的 OS X)
-
用命令行執行腳本時, 指定解釋器: python3 ./my_script.py;
-
也可以在腳本內, 通過 shebang 指定解釋器. 比如想讓 Python3 解釋器來執行腳本, 那么, 在 Python 腳本的第一行寫上 #!/usr/bin/python3 或者是 #!/usr/bin/env python3, 然后用命令行直接調用文件 -- ./my_script.py, shell 會檢查腳本的第一行代碼, 發現有 shebang, 會按其指定的解釋器來執行;
-
如果上面兩種方式是沖突的, 比如在 shebang 中指定 python3, 但是命令行執行時指定 Python2 -- python2 ./my_script.py, 結果會如何? 結果是"命令行指定"比 "shebang 指定"更優先. 下面是試驗:
文件名為 diff_interpreter.py 的 Python 腳本, 其代碼指定了 Python 3:
#!/usr/bin/env python3
print(3/2)
二. 如果是在圖形界面, 通過雙擊文件來執行腳本:
系統會根據該文件類型設定的軟件打開.
比如 Windows, 會根據文件擴展名來決定打開方式. 如果你之前設置了 *.py 后綴的文件用 python3 的軟件打開, 雙擊時就會用 python3 打開. 如果碰到 python 2.x 的腳本, 則需要右鍵更改"打開方式".
OS X 也是如此.
為什么選用 #! 作為 Shebang 的標志符?
因為大部分的編程語言把 # 開頭的代碼解釋為注釋.
即使某種語言不是以 # 作為注釋的標志符, 由於 shebang 的流行, 其解釋器對於首行以#!開頭的內容, 也會識別出這是 shebang, 從而忽略這一行.
如何使用 Shebang 指定 Python 解釋器?
可以在腳本第一行寫上 #!/usr/bin/env python3 或者 #!/usr/bin/python3:
1.#!/usr/bin/python3 表示 python3 解釋器所處的絕對路徑就是 /usr/bin/python3, 路徑被寫死了, 類似於編程中的"硬編碼".之所以有這種寫法, 是因為在類 Unix 系統中, python 解釋器一般情況下都位於這個路徑.不過, 如果碰到 python 解釋器不在該路徑下的話, 腳本就無法執行了!
2.#!/usr/bin/env/ python3 表示從 "PATH 環境變量"中查找 python3 解釋器的位置, 路徑沒有被寫死, 而是在"環境變量"中尋找 python3 解釋器的安裝路徑, 再調用該路徑下的解釋器來執行腳本.
顯然, 采用 #!/usr/bin/env python3 的寫法更靈活更具有通用性, 推薦使用這種寫法.
如何使用 Shebang 指定 shell 解釋器?
使用 shebang:
#!/bin/sh 表示用 Bourne shell 來執行.
如果系統中沒有 sh, 會選擇兼容的 shell 解釋器
#!/bin/bash 表示用 Bash shell 來執行.
如果系統中沒有 bash, 會選擇兼容的 shell 解釋器
注意
1. #!之后的空格是可選的, #!/usr/bin/env python3 和 #! /usr/bin/env python3 這兩種寫法都是允許的
2. 大部分 Python 文件不必寫 Shebang, 只有被直接執行的文件才有必要加入 Shebang
額外
Python 腳本開頭經常見到這樣的代碼:
#!/usr/bin/env python
#coding=utf-8
之所以寫 #coding=utf-8 是為了指定字符編碼.
為什么要指定字符編碼?
因為 Python 2 默認使用的是 ASCII 編碼 (不支持中文), Python 3 默認使用 UTF-8 編碼 (萬國碼, 支持中文).
所以 Python 2 中為了支持中文, 都會在開頭加入 #coding=utf-8 這個聲明. 而 Python 3 默認支持 UTF-8 編碼, 所以 Python 3 並不需要 #coding=utf-8 聲明
注意:
常見的寫法有: #coding=utf-8 和 #! -- coding:utf-8 --, 都是合法有效的
但是, coding 和 =之間, 或者coding 和 :之間, 不能有空格!