一、os.system(commandString)
import os
statusCode=os.system("powershell sleep 3 ;echo 天下大势为我所控")
print("over",statusCode)
- 这里使用了powershell来执行sleep命令,在cmd里面是没有sleep命令的。
- 会发现os.system(commandString)是阻塞的。
- 这个函数类似C语言里面的stdlib.h中的system命令
- 这种方法只负责运行程序并获取程序结束状态值,无法获取输出,输出会直接打印到stdout,所以要想获取输出也可以重定向一下stdout,然而没有这个必要,可以用下面的方法。
二、os.popen(commandString)
这种方法已经不鼓励使用了
import os
pipe=os.popen("powershell sleep 3 ;echo 天下大势为我所控")
s=pipe.read()
print(s)
这种方法直接接受运行的输出结果,这种方法的缺点是无法获取程序的结束状态。
你道好玩不好玩,os.system()只获取状态不获取输出,os.popen()只获取输出不获取状态,它们各有用武之地。
但是,肯定有一种方法能够同时获取这两者。
三、使用commands模块
这个模块在Python3中已经废弃了
import commands
(status, output) = commands.getstatusoutput('cat /proc/cpuinfo')
print status,output
四、鼓励使用:subprocess
subprocess模块主要有四个方法:
- call
- check_call
- check_output
- Popen
import subprocess
statusCode=subprocess.call("echo one",shell=True)#相当于system命令,只返回状态值,并打印输出到stdout
print(statusCode)
x=subprocess.check_call(["echo"," two"],shell=True)
print(x)
x=subprocess.check_output("echo three",shell=True)#只获取output
print(x)
import subprocess
obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',) #在cwd目录下执行命令
import subprocess
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
obj.stdin.write("print(1)\n")
obj.stdin.write("print(2)")
obj.stdin.close()
cmd_out = obj.stdout.read()
obj.stdout.close()
cmd_error = obj.stderr.read()
obj.stderr.close()
print(cmd_out)
print(cmd_error)
import subprocess
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
obj.stdin.write("print(1)\n")
obj.stdin.write("print(2)")
out_error_list = obj.communicate()
print(out_error_list)
import subprocess
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
out_error_list = obj.communicate('print("hello")')
print(out_error_list)