Python调用系统命令的四种方法

时间:2020-12-08 08:15:39

一、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)