详解Python执行py文件是否需要可执行权限

 更新时间:2023年03月13日 14:59:37   作者:DECHIN  
这篇文章主要通过几个案例为大家详细介绍一下在Python中执行py文件是否需要可执行权限,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以了解一下

案例解析

这个问题描述起来有点违反直觉,要执行一个文件难道不应该需要可执行权限吗?让我们先来看一个例子:

# module1.py
def test():
    print ('hello world!')
 
if __name__ == '__main__':
    test()

这是一个名为module1.py的文件,这个文件仅有可读权限:

[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!

我们发现即使只有可读权限,这个文件也是可以运行的。为了严格验证,我们这里创建另外一种模式的测试,通过import来导入python文件,是否也不需要可执行权限呢?

# module2.py
from module1 import test
 
if __name__ == '__main__':
    test()

同样的,我们新建的文件也未赋予可执行权限:

[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这个文件:

[dechin@dechin-manjaro excute]$ python3 module2.py 
hello world!

那么我们的测试就完成了,经过验证,执行普通的py文件是不需要可执行权限的,这对我们的权限最小化约束就产生了一定的启发作用。

原理解释

在stackoverrun上面有一条回复,作者cedbeu是这样描述的:python本身承担了语言解析器的角色,py文件不过是一个文本文件,真正执行的二进制文件是python而不是用户所创建的py文件。因此,即使去掉py文件的可执行权限,该py文件也是可以通过python来执行的。但是,如果我们去掉了python的可执行权限,那就无法正常执行这一条任务了。

扩展测试

如果将py文件编译成pyc和pyo格式的文件,此时的任务执行是否需要可执行权限呢?首先测试pyc文件:

[dechin@dechin-manjaro excute]$ python3 -m py_compile module1.py

执行完编译,我们会在当前目录下发现一个__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文件的文件名会固定有个后缀,同样也没有可执行权限,这里我们用同样的命令来执行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!

这里我们可以发现,不论是直接执行pyc文件,或者是改名为module1.pyc之后再通过module2.py导入的方式,都可以正常的被执行,而且都不具有可执行权限。接下来我们再尝试一下pyo文件:

[dechin@dechin-manjaro excute]$ python3 -O -m py_compile module1.py 

执行带有opt的pyc文件:

[dechin@dechin-manjaro __pycache__]$ python3 module1.cpython-38.opt-1.pyc 
hello world!

同样的,都可以正常的被执行,即使没有可执行权限。

技术彩蛋

即使我们把pyc文件强行改名为py文件,同样也是不影响任务执行的:

[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!

到此这篇关于详解Python执行py文件是否需要可执行权限的文章就介绍到这了,更多相关Python执行py文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Tensorflow实现在训练好的模型上进行测试

    Tensorflow实现在训练好的模型上进行测试

    今天小编就为大家分享一篇Tensorflow实现在训练好的模型上进行测试,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • pandas.dataframe中根据条件获取元素所在的位置方法(索引)

    pandas.dataframe中根据条件获取元素所在的位置方法(索引)

    今天小编就为大家分享一篇pandas.dataframe中根据条件获取元素所在的位置方法(索引),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Pytorch阅读文档中的flatten函数

    Pytorch阅读文档中的flatten函数

    PyTorch提供了一个非常方便的函数flatten()来完成这个任务,本文将介绍Pytorch阅读文档中的flatten函数,并提供一些示例代码,感兴趣的朋友一起看看吧
    2023-11-11
  • 基于Python实现n-gram文本生成的示例代码

    基于Python实现n-gram文本生成的示例代码

    N-gram是自然语言处理中常用的技术,它可以用于文本生成、语言模型训练等任务,本文主要介绍了如何在Python中实现n-gram文本生成,需要的可以参考下
    2024-01-01
  • python3使用logging包,如何把日志写到系统的rsyslog中

    python3使用logging包,如何把日志写到系统的rsyslog中

    这篇文章主要介绍了python3使用logging包,如何把日志写到系统的rsyslog中的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python中str.join()简单用法示例

    Python中str.join()简单用法示例

    这篇文章主要介绍了Python中str.join()简单用法,结合实例形式分析了Python中str.join()用于连接生成新字符串的相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • python数据挖掘Apriori算法实现关联分析

    python数据挖掘Apriori算法实现关联分析

    这篇文章主要为大家介绍了python数据挖掘Apriori算法实现关联分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python while true实现爬虫定时任务

    Python while true实现爬虫定时任务

    这篇文章主要介绍了Python爬虫定时任务简单实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Django利用cookie保存用户登录信息的简单实现方法

    Django利用cookie保存用户登录信息的简单实现方法

    这篇文章主要介绍了Django利用cookie保存用户登录信息的简单实现方法,结合实例形式分析了Django框架使用cookie保存用户信息的相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • Python global全局变量函数详解

    Python global全局变量函数详解

    本文详解了global全局变量函数的用法,还有global的作用。global全局变量在一个脚本中全部作用域都可以访问,用法很方便,希望本文对大家有所帮助
    2018-09-09

最新评论