Python面试高频问题: os.system()和os.popen()的区别
Posted 测试开发Kevin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面试高频问题: os.system()和os.popen()的区别相关的知识,希望对你有一定的参考价值。
os.system()和os.popen()概述
大家搞python与操作系统交互时,必须掌握的两个方法就是os.system()和os.popen(),也是在相关技术领域面试中必问的题目!本文就对这两个命令进行详细介绍,os.system()和os.popen()都可以执行shell命令,但是他们还是有一定的区别的。
话不多说,先拿实例说事儿!
目录/opt/scripts/test 中包括文件:ClassDemo2.groovy ClassDemo.groovy Demo3.groovy pyscript.py
我们执行os.system命令:
>>> os.system('cd /opt/scripts/test;ls')
ClassDemo2.groovy ClassDemo.groovy Demo3.groovy pyscript.py
0
这里的0表示执行成功
接下来再看os.popen命令:
>>> os.popen('cd /opt/scripts/test;ls')
<open file 'cd /opt/scripts/test;ls', mode 'r' at 0x7fa7dd7d1660>
如果想看到具体的值,可以这样使用
>>> f=os.popen('cd /opt/scripts/test;ls')
>>> print(f.readlines())
['ClassDemo2.groovy\\n', 'ClassDemo.groovy\\n', 'Demo3.groovy\\n', ,'pyscript.py\\n']
注意如果连续执行多条语句可以使用“;”分割,实例中的cd /opt/scripts/test;ls 就是相关应用。
具体细节如下:
1. 命令被分号“;”分隔,这些命令会顺序执行下去;
2. 命令被“&&”分隔,这些命令会顺序执行下去,遇到执行错误的命令停止;
3. 命令被双竖线“||”分隔,这些命令会顺序执行下去,遇到执行成功的命令停止,后面的所有命令都将不会执行;
os.system细节
os.system方法是os模块最基础的方法,其它的方法一般在该方法基础上封装完成。返回的是退出状态码。os的system原理是每一条system函数执行时,通过当前 Shell 启动的一个新的子进程或子 Shell 被称为 SubShell (子 Shell )。子 Shell 会自动继承父 Shell 的很多环境,如环境变量、工作目录、文件描述符等,但是反之,子 Shell 中的环境仅在子 Shell 中有效,父 Shell 无法读取子 Shell 的环境。例如,如果在父 shell 里定义全局变量,子 shell 中就可以调用该变量。但当在子 shell 中定义一个局部变量时,父 shell 是无法读取该变量的。
os.popen细节
os.popen() 方法用于从一个命令打开一个管道,返回的是命令的输出结果。从这个命令获取的值可以继续被使用。因为它返回一个文件对象,可以对这个文件对象进行相关的操作。
popen()方法语法格式:
os.popen(command[, mode[, bufsize]])
参数:
command -- 使用的命令
mode -- 模式权限可以是 'r'(默认) 或 'w'。
bufsize -- 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。负的bufsize意味着使用系统的默认值,一般来说,对于终端设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。
返回值:
返回一个文件描述符号为fd(文件索引)的打开的文件对象
二者使用总结
如果要直接看到运行结果的话,应该使用os.system;如果需要获取返回值做进一步的处理则使用os.popen
Python 面试高频问题:cls到底是啥
参考技术A 上一篇文章介绍了什么是python 中的self,详情请参考:Python面试高频问题:self到底是什么
简单的说self是类(Class)实例化的对象。
面试中还有一个问题经常被提及,那就是——什么是cls呢?
cls 是类(或子类)本身,取决于调用的是哪个类。
看下面的实例
输出:
我们也可以通过实例的方法调用class method,例如:
同样输出
输出:
使用cls 作为方法参数时,通常该方法需要由@classmethod 修饰,@classmethod修饰的方法表示的是类方法。这里需要注意cls就是一个标识,你可以把他写成abc,bcd都是可以的,只是出于习惯写成了cls。
既然cls是一个类,那么我们就可以使用他来进行实例化,具体代码如下:
输出:
可以看到通过obj1=cls()和obj2=cls(),成功创建了两个实例,分别是0x000000690A1E0C08和0x000000690A1E0C48,而这两个实例的类型都是MyClass3'
另外cls 还可以在python类中的方法 __new__里实现,通常定义为:
最后我们可以简单地总结一下self 和 cls:简单的说self是类(Class)实例化的对象。
cls 是类(或子类)本身。我们也可以方便地理解self表示实例的,cls则表示类的!
以上是关于Python面试高频问题: os.system()和os.popen()的区别的主要内容,如果未能解决你的问题,请参考以下文章
高频一线大厂 Python 面试题:算法+爬虫+数据处理+基础