-Python_cmd的各种实现方法及优劣

2017-01-01 10:46

1. 使用os.system("cmd")

  • 这是最简单的一种方法,特点是执行的时候程序会打出cmd在linux上执行的信息。使用前需要import os。
  • os.system执行命令后只返回执行结果的状态,即执行成功则返回0,如不成功则返回一个非零的数值,无法处理输入,所有输出都送到stdout,无法被你的脚本捕获。
os.system("ls")  

2. 使用Popen模块产生新的process

  • 现在大部分人都喜欢使用Popen。Popen方法不会打印出cmd在linux上执行的信息。的确,Popen非常强大,支持多种参数和模式。使用前需要from subprocess import Popen, PIPE。但是Popen函数有一个缺陷,就是它是一个阻塞的方法。如果运行cmd时产生的内容非常多,函数非常容易阻塞住。解决办法是不使用wait()方法,但是也不能获得执行的返回值了。 Popen原型是:
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

Popen("adb logcat", shell=True, stdout=PIPE, stderr=PIPE)   
  • 在使用subpress读取adb logcat过滤信息,进程还是被阻塞,无论都杀不死,最后这样解决
handle = subprocess.Popen("adb -d logcat >" +log, shell=True) time.sleep(1) subprocess.Popen("taskkill /F /T /PID " + str(handle.pid) , shell=True)

3. 使用commands.getstatusoutput方法

  • 这个方法也不会打印出cmd在linux上执行的信息。这个方法唯一的优点是,它不是一个阻塞的方法。即没有Popen函数阻塞的问题。使用前需要import commands。
status, output = commands.getstatusoutput("ls")  
commands.getoutput("ls")  
commands.getstatus("ls")  

综上所述,如果只是需要执行一个系统命令,只需要知道执行的结果状态,对命令的输出不care,那就用os.system吧;如果不但需要执行的结果状态还需要捕获命令的输出,那就commands吧;如果想对执行的命令进行全面的控制,那就subprocess或popen。

来自:

  • http://blog.sina.com.cn/s/blog_a04184c101010ksr.html
  • http://blog.csdn.net/menglei8625/article/details/7494094