1. 程式人生 > >python中os.system、os.popen、subprocess.popen的區別

python中os.system、os.popen、subprocess.popen的區別

最近專案中需要在python中執行shell指令碼,以下解釋使用os.system、
os.popen和subprocess.popen的區別:

1.os.system

該函式返回命令執行結果的返回值,system()函式在執行過程中進行了以下三步操作:
1.fork一個子程序;
2.在子程序中呼叫exec函式去執行命令;
3.在父程序中呼叫wait(阻塞)去等待子程序結束。
對於fork失敗,system()函式返回-1。
由於使用該函式經常會莫名其妙地出現錯誤,但是直接執行命令並沒有問題,所以一般建議不要使用。

2.os.popen

popen() 建立一個管道,通過fork一個子程序,然後該子程序執行命令。返回值在標準IO流中,該管道用於父子程序間通訊。父程序要麼從管道讀資訊,要麼向管道寫資訊,至於是讀還是寫取決於父程序呼叫popen時傳遞的引數(w或r)。通過popen函式讀取命令執行過程中的輸出示例如下:

#!/usr/bin/python
import os

p=os.popen('ssh 10.3.16.121 ls')
x=p.read()
print x
p.close()

3.subprocess模組

1)概述

  subprocess模組是在2.4版本中新增的,官方文件中描述為可以用來替換以下函式:

    os.system、os.spawn、os.popen、popen2

2)引數

官方對於subprocess模組的引數解釋如下:

args is required for all calls and should be a string, or a sequence of program arguments. Providing a sequence of arguments is generally preferred, as it allows the module to take care of any required escaping and quoting of arguments (e.g. to permit spaces in file names). If passing a single string, either shell must be True (see below) or else the string must simply name the program to be executed without specifying any arguments.

這裡寫圖片描述

引數既可以是string,也可以是list。
subprocess.Popen([“cat”,”test.txt”])
subprocess.Popen(“cat test.txt”, shell=True)
對於引數是字串,需要指定shell=True

3)使用示例

  • 其中subprocess.call用於代替os.system,示例:
import subprocess
returnCode = subprocess.call('adb devices')
print returnCode
  • subprocess.check_output

  • subprocess.Popen的使用

    1.執行結果儲存在檔案

cmd = "adb shell ls /sdcard/ | findstr aa.png"  
fhandle = open(r"e:\aa.txt", "w")  
pipe = subprocess.Popen(cmd, shell=True, stdout=fhandle).stdout  
fhandle.close()  

         2.執行結果使用管道輸出

pipe=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE).stdout  
print pipe.read() 

4.commands.getstatusoutput()

      使用commands.getstatusoutput() 方法就可以獲得到返回值和輸出:

(status, output) = commands.getstatusoutput('sh hello.sh')
print status, output