Python中执行系统命令常见的几种方法

(1)   os.system

  这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息。

  import os

  os.system('cat /proc/cupinfo')

(2)  os.popen 

  该方法不但执行命令还返回执行后的信息对象,是通过一个管道文件将结果返回。

  output = os.popen('cat /proc/cpuinfo')

  print output.read()

(3)  使用模块commands模块

  import commands

  (status, output) = commands.getstatusoutput('cat /proc/cpuinfo')

  print status,output

  注意1:在类unix的系统下使用此方法返回的返回值(status)与脚本或命令执行之后的返回值不等,这是因为调用了os.wait()的缘故,

  具体原因就得去了解下系统wait()的实现了。需要正确的返回值(status),只需要对返回值进行右移8位操作就可以了。

  注意2:当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess。

(4)   使用模块subprocess

  Subprocess是一个功能强大的子进程管理模块,是替换os.system ,os.spawn* 等方法的一个模块。

  Class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None,

  stderr=None, preexec_fn=None, close_fds=True, shell=False,

  cwd=None, env=None, universal_newlines=False, startupinfo=None,

  creationflags=0, restore_signals=True, start_new_session=False, pass_fds=())

  有丰富的参数可以进行配置,可供我们自定义的选项多,灵活性高。之前我使用os.system的时候遇到文件描述符被子进程继承的问题,后来通过close_fds = False 这个参数来解决的。

举个🌰:

    

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import os,sys
 5 import subprocess
 6 
 7 p = subprocess.Popen('ls %s' % pathname, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
 8 for line in p.stdout.readlines():
 9     print line
10 
11 retval = p.wait()
12 print retail
13 
14 mm = subprocess.call(["ls","-l", "/home/mywork/imooc/py_study/tmp"])
15 nn = subprocess.call(["ls /home/mywork/imooc/py_study/tmp"],shell=True)
16 
17 都是返回同样的结果

 

  

posted @ 2017-12-27 16:22  北京流浪儿  阅读(1575)  评论(0编辑  收藏  举报