os是python的两大核心系统模块之一,另一个是sys模块。它包含了所有C中常用的系统调用和命令脚本。包括目录,进程,命令行变量,诸如此类。从技术上说,os模块提供了POSIX工具(跨平台的系统调用)和一个与平台无关的目录处理子模块os.path。从操作上说,os模块提供了访问计算机系统调用的接口:引用了os和os.path模块的脚本可以在任意平台上运行。除此之外,os还专门为某些平台提供服务工具(比如,在Unix上的低级进程调用);总的来说,os模块是跨平台的。
os
查看os的属性名
dir(os)
管理工具
os.getpid() 获取os调用进程的id
os.getcwd() 获取当前工作目录(current working directory)
os.chdir(dir) 改变当前工作目录
os.startfile(filename) 打开一个文件
os.startfile("webpage.html") # open file in your web browser
os.startfile("document.doc") # open file in Microsoft Word
os.startfile("myscript.py") # run file with Python
可移植常量
os.pathsep 目录间隔符(windows/DOS下为分号,Unix为冒号)
os.sep 目录成分间隔符(windows下为'\',Unix为'/')
os.pardir 上层目录
os.curdir 当前目录
os.linesep 行分隔符(windows下为'\r\n')
运行命令行
os.system 在python脚本中运行命令行指令,返回的是命令行的执行状态(0表示成功,1表示失败)
os.popen 运行命令行指令,创建一个仿文件对象(file-like object)。默认的情况下创建模式为'r',是只读的,要支持写入,需要添加'w'模式(第六节会探讨os.popen的重定向)
>>> f = os.popen('echo hello')#f = os.popen('echo hello','r')
>>> f.read()
'hello\n'
subprocess模块
这个模块提供运行命令行指令的接口,比os.system和os.popen更灵活
subprocess.call('cmd /C "command line"') #和os.system功能一样
subprocess.call(cmdLine, shell = False) #shell默认值为False,为True表示使用命令解析器(如MS-DOS)
pipeObject = subprocess.Popen(cmdLine, stdout = subprocess.PIPE,shell = False)#输出流使用subprocess.PIPE管道
pipeObject.communicate() #返回二元组,第一个元素是执行的结果,第二个元素是None
pipeObject.returncode() #命令执行的状态码(0表示成功)
pipeObject.stdout #仿文件对象,存储命令执行结果
pipeObject.wait() #等待命令执行结束,返回的是执行状态码(0表示成功)
缺陷
虽然os.system,os.popen,subprocess.call和subprocess.Popen接口是可移植的,但是运行的指令不一定是可移植的。所以它们的可移植性会打折扣;在程序中直接运行另一个脚本程序比导入和调用本地函数要慢得多。在运行os.system/os.popen语句时,开启命令行中的脚本程序会另起一个进程;
os.system执行的时候,会堵塞调用者,直到命令行执行结束。为解决这个问题,在linux/Unix系统中,可以在命令行的结尾添加一个'&';在windows的中,使用MS-DOS的start指令可以将命令行在命令解析器中执行(如MS-DOS)。
os.path
查看嵌套模块os.path的属性名
dir(os.path)
os.path.isfile(fullname/name) #是否文件,fullname是完整文件名(如"C:\\file\\1.txt")
os.path.isdir(directory) #是否目录
os.path.split(fullname) #将完整文件名分割为一个二元组,第一个为文件目录,第二个为文件名
os.path.join(directory, name) #将目录和文件名拼接为一个完整文件名
os.path.dirname(fullname) #获取完整文件名中的文件目录
os.path.basename(fullname) #获取完整文件名中的文件名
os.path.splitext(fullname/name) #将文件名和后缀提取出来,拼接为一个二元组
os.path.normpath(directory) #如果directory中既有'\'也有'/',则根据当前的操作系统,统一为'\\'或者'/'
os.path.abspath(directory) #获取directory所在的绝对目录