#! /usr/bin/python 到底有什麼用

一般python腳本的第一行,都會有這麼一個東西。以前寫python,都不知道這個東西有什麼用。。。所以最近研究了一下,發現還是有用處的。

寫法

首先這個東西叫“shebang”。不知道爲什麼叫這個名字:)

這句話的正確寫法是#! /usr/bin/python。錯誤寫法# !/usr/bin/python。正確與錯誤的區別就在於#!之間是否有空格。沒有空格就是正確的。有空格就是錯誤的。錯誤情況的示例如下:
語法錯誤

[root@jeremyqin1584598822574-0 /data]# ./a.py
./a.py: line 4: syntax error near unexpected token `('
./a.py: line 4: `def fun():'

作用

shebang其實是給Linux用的,不是給Python解釋器(或者你說的“編譯器”)用的,準確來說是給shell用的。它代表如果這個文件當作一個可執行文件來執行的時候,要調用哪個腳本引擎,像一般Shell腳本就會寫#!/bin/bash之類。如果直接用python執行,是不需要的。對Python來說這就是一行註釋。所以當這個Python腳本具備可執行權限時,利用./a.py這種方式來執行時就生效了。系統通過解析shebang,來獲取執行腳本所需要的執行引擎。

通常,有如下三種寫法:
#! /usr/bin/python —>python2
#! /usr/bin/python3 —>python3
#! /usr/bin/env python ---->同時支持python2,python3

原理

這塊內容是在知乎上看到的,記錄下來
https://www.zhihu.com/question/68052314/answer/259441348
當你在 Unix 家族的命令行上執行 ./xxx.py 的時候,所使用的 shell 會先檢查一下這個文件有沒有可執行屬性,有的話,fork 一個子進程,然後 exec 該文件。而在 exec 這個系統調用裏,首先就得判斷,要加載進來執行的文件倒底是啥格式呀,比如二進制可執行文件格式吧,Linux 默認就支持 a.out 和 elf 兩種,所以加 exec 第一步就得把這個文件的頭上一塊讀進內存了,search_binary_handler 來找一下對應的 bin_fmt_handler 內核模塊,而處理可執行腳本的那個 binary format handler 叫 bin_fmt_script,它會解釋 #! 後面的內容,最終用 bin_fmt_aout 或 bin_fmt_elf 將解釋器裝載進來執行,並將腳本路徑做爲參數傳給解釋器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章