1. 程式人生 > >執行py檔案需要可執行許可權嗎?

執行py檔案需要可執行許可權嗎?

# 案例解析 這個問題描述起來有點違反直覺,要執行一個檔案難道不應該需要可執行許可權嗎?讓我們先來看一個例子: ```python # module1.py def test(): print ('hello world!') if __name__ == '__main__': test() ``` 這是一個名為`module1.py`的檔案,這個檔案僅有可讀許可權: ```bash [dechin@dechin-manjaro excute]$ ll -r--r--r-- 1 dechin dechin 78 1月 15 17:06 module1.py ``` 我們可以直接用python來執行一下這個檔案: ```bash [dechin@dechin-manjaro excute]$ python3 module1.py hello world! ``` 我們發現即使只有可讀許可權,這個檔案也是可以執行的。為了嚴格驗證,我們這裡建立另外一種模式的測試,通過import來匯入python檔案,是否也不需要可執行許可權呢? ```python # module2.py from module1 import test if __name__ == '__main__': test() ``` 同樣的,我們新建的檔案也未賦予可執行許可權: ```bash [dechin@dechin-manjaro excute]$ ll -r--r--r-- 1 dechin dechin 78 1月 15 17:06 module1.py -r--r--r-- 1 dechin dechin 64 1月 15 17:44 module2.py ``` 我們執行一下`module2.py`這個檔案: ```bash [dechin@dechin-manjaro excute]$ python3 module2.py hello world! ``` 那麼我們的測試就完成了,經過驗證,執行普通的py檔案是不需要可執行許可權的,這對我們的許可權最小化約束就產生了一定的啟發作用。 # 原理解釋 在stackoverrun上面有一條回覆,作者*cedbeu*是這樣描述的:`python`本身承擔了語言解析器的角色,`py檔案`不過是一個文字檔案,真正執行的二進位制檔案是`python`而不是使用者所建立的`py檔案`。因此,即使去掉`py檔案`的可執行許可權,該`py檔案`也是可以通過python來執行的。但是,如果我們去掉了`python`的可執行許可權,那就無法正常執行這一條任務了。 # 擴充套件測試 如果將`py檔案`編譯成`pyc`和`pyo`格式的檔案,此時的任務執行是否需要可執行許可權呢?首先測試`pyc檔案`: ```bash [dechin@dechin-manjaro excute]$ python3 -m py_compile module1.py ``` 執行完編譯,我們會在當前目錄下發現一個`__pycache__`的資料夾,編譯好的`pyc檔案`就儲存在這個目錄下: ```bash [dechin@dechin-manjaro excute]$ tree . ├── module1.py ├── module2.py └── __pycache__ └── module1.cpython-38.pyc 1 directory, 3 files [dechin@dechin-manjaro excute]$ cd __pycache__/ [dechin@dechin-manjaro __pycache__]$ ll 總用量 4 -rw-r--r-- 1 dechin dechin 259 1月 15 18:01 module1.cpython-38.pyc ``` 這裡我們看到`pyc檔案`的檔名會固定有個字尾,同樣也沒有可執行許可權,這裡我們用同樣的命令來執行`pyc檔案`: ```bash [dechin@dechin-manjaro __pycache__]$ ll -r--r--r-- 1 dechin dechin 259 1月 15 18:01 module1.cpython-38.pyc -rw-r--r-- 1 dechin dechin 259 1月 15 18:13 module1.pyc -r--r--r-- 1 dechin dechin 64 1月 15 18:09 module2.py [dechin@dechin-manjaro __pycache__]$ python3 module1.cpython-38.pyc hello world! [dechin@dechin-manjaro __pycache__]$ python3 module2.py hello world! ``` 這裡我們可以發現,不論是直接執行`pyc檔案`,或者是改名為`module1.pyc`之後再通過`module2.py`匯入的方式,都可以正常的被執行,而且都不具有可執行許可權。接下來我們再嘗試一下pyo檔案: ```bash [dechin@dechin-manjaro excute]$ python3 -O -m py_compile module1.py ``` 執行帶有`opt`的`pyc檔案`: ```bash [dechin@dechin-manjaro __pycache__]$ python3 module1.cpython-38.opt-1.pyc hello world! ``` 同樣的,都可以正常的被執行,即使沒有可執行許可權。 # 技術彩蛋 即使我們把`pyc檔案`強行改名為`py檔案`,同樣也是不影響任務執行的: ```bash [dechin@dechin-manjaro __pycache__]$ cp module1.cpython-38.opt-1.pyc module1.py [dechin@dechin-manjaro __pycache__]$ ll 總用量 20 -rw-r--r-- 1 dechin dechin 259 1月 15 18:17 module1.cpython-38.opt-1.pyc -r--r--r-- 1 dechin dechin 259 1月 15 18:01 module1.cpython-38.pyc -rw-r--r-- 1 dechin dechin 259 1月 15 18:20 module1.py -rw-r--r-- 1 dechin dechin 259 1月 15 18:13 module1.pyc -r--r--r-- 1 dechin dechin 64 1月 15 18:09 module2.py [dechin@dechin-manjaro __pycache__]$ python3 module1.py hello world! ``` 在後續的文章中,我會專門寫一篇文章,分析如何分辨`py檔案`與`改名之後的pyc