詳解Python執(zhí)行py文件是否需要可執(zhí)行權(quán)限
案例解析
這個問題描述起來有點違反直覺,要執(zhí)行一個文件難道不應(yīng)該需要可執(zhí)行權(quán)限嗎?讓我們先來看一個例子:
# module1.py def test(): print ('hello world!') if __name__ == '__main__': test()
這是一個名為module1.py的文件,這個文件僅有可讀權(quán)限:
[dechin@dechin-manjaro excute]$ ll
-r--r--r-- 1 dechin dechin 78 1月 15 17:06 module1.py
我們可以直接用python來運行一下這個文件:
[dechin@dechin-manjaro excute]$ python3 module1.py
hello world!
我們發(fā)現(xiàn)即使只有可讀權(quán)限,這個文件也是可以運行的。為了嚴(yán)格驗證,我們這里創(chuàng)建另外一種模式的測試,通過import來導(dǎo)入python文件,是否也不需要可執(zhí)行權(quán)限呢?
# module2.py from module1 import test if __name__ == '__main__': test()
同樣的,我們新建的文件也未賦予可執(zhí)行權(quán)限:
[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
我們執(zhí)行一下module2.py這個文件:
[dechin@dechin-manjaro excute]$ python3 module2.py
hello world!
那么我們的測試就完成了,經(jīng)過驗證,執(zhí)行普通的py文件是不需要可執(zhí)行權(quán)限的,這對我們的權(quán)限最小化約束就產(chǎn)生了一定的啟發(fā)作用。
原理解釋
在stackoverrun上面有一條回復(fù),作者cedbeu是這樣描述的:python本身承擔(dān)了語言解析器的角色,py文件不過是一個文本文件,真正執(zhí)行的二進制文件是python而不是用戶所創(chuàng)建的py文件。因此,即使去掉py文件的可執(zhí)行權(quán)限,該py文件也是可以通過python來執(zhí)行的。但是,如果我們?nèi)サ袅藀ython的可執(zhí)行權(quán)限,那就無法正常執(zhí)行這一條任務(wù)了。
擴展測試
如果將py文件編譯成pyc和pyo格式的文件,此時的任務(wù)執(zhí)行是否需要可執(zhí)行權(quán)限呢?首先測試pyc文件:
[dechin@dechin-manjaro excute]$ python3 -m py_compile module1.py
執(zhí)行完編譯,我們會在當(dāng)前目錄下發(fā)現(xiàn)一個__pycache__的文件夾,編譯好的pyc文件就存儲在這個目錄下:
[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文件的文件名會固定有個后綴,同樣也沒有可執(zhí)行權(quán)限,這里我們用同樣的命令來執(zhí)行pyc文件:
[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!
這里我們可以發(fā)現(xiàn),不論是直接執(zhí)行pyc文件,或者是改名為module1.pyc之后再通過module2.py導(dǎo)入的方式,都可以正常的被執(zhí)行,而且都不具有可執(zhí)行權(quán)限。接下來我們再嘗試一下pyo文件:
[dechin@dechin-manjaro excute]$ python3 -O -m py_compile module1.py
執(zhí)行帶有opt的pyc文件:
[dechin@dechin-manjaro __pycache__]$ python3 module1.cpython-38.opt-1.pyc
hello world!
同樣的,都可以正常的被執(zhí)行,即使沒有可執(zhí)行權(quán)限。
技術(shù)彩蛋
即使我們把pyc文件強行改名為py文件,同樣也是不影響任務(wù)執(zhí)行的:
[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!
到此這篇關(guān)于詳解Python執(zhí)行py文件是否需要可執(zhí)行權(quán)限的文章就介紹到這了,更多相關(guān)Python執(zhí)行py文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Tensorflow實現(xiàn)在訓(xùn)練好的模型上進行測試
今天小編就為大家分享一篇Tensorflow實現(xiàn)在訓(xùn)練好的模型上進行測試,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01pandas.dataframe中根據(jù)條件獲取元素所在的位置方法(索引)
今天小編就為大家分享一篇pandas.dataframe中根據(jù)條件獲取元素所在的位置方法(索引),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06基于Python實現(xiàn)n-gram文本生成的示例代碼
N-gram是自然語言處理中常用的技術(shù),它可以用于文本生成、語言模型訓(xùn)練等任務(wù),本文主要介紹了如何在Python中實現(xiàn)n-gram文本生成,需要的可以參考下2024-01-01python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中
這篇文章主要介紹了python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09python數(shù)據(jù)挖掘Apriori算法實現(xiàn)關(guān)聯(lián)分析
這篇文章主要為大家介紹了python數(shù)據(jù)挖掘Apriori算法實現(xiàn)關(guān)聯(lián)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05Python while true實現(xiàn)爬蟲定時任務(wù)
這篇文章主要介紹了Python爬蟲定時任務(wù)簡單實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06Django利用cookie保存用戶登錄信息的簡單實現(xiàn)方法
這篇文章主要介紹了Django利用cookie保存用戶登錄信息的簡單實現(xiàn)方法,結(jié)合實例形式分析了Django框架使用cookie保存用戶信息的相關(guān)操作技巧,需要的朋友可以參考下2019-05-05