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
网友评论