python中執行shell的兩種方法總結

這篇文章主要介紹了python中執行shell的兩種方法,有兩種方法能夠在Python中執行SHELL程序,方法一是使用Python的commands包,方法二則是使用subprocess包,這兩個包均是Python現有的內置模塊。須要的朋友能夠參考借鑑,下面來一塊兒看看吧。

1、使用python內置commands模塊執行shellhtml

commands對Python的os.popen()進行了封裝,使用SHELL命令字符串做爲其參數,返回命令的結果數據以及命令執行的狀態;python

該命令目前已經廢棄,被subprocess所替代;shell

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# coding=utf-8
'''
Created on 2013年11月22日
  
@author: crazyant.net
'''
import commands
import pprint
  
def cmd_exe(cmd_String):
   print "will exe cmd,cmd:" + cmd_String
   return commands.getstatusoutput(cmd_String)
  
if __name__ = = "__main__" :
   pprint.pprint(cmd_exe( "ls -la" ))

2、使用python最新的subprocess模塊執行shell服務器

Python目前已經廢棄了os.system,os.spawn*,os.popen*,popen2.*,commands.*來執行其餘語言的命令,subprocesss是被推薦的方法;學習

subprocess容許你能建立不少子進程,建立的時候能指定子進程和子進程的輸入、輸出、錯誤輸出管道,執行後能獲取輸出結果和執行狀態。google

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# coding=utf-8
'''
Created on 2013年11月22日
  
@author: crazyant.net
'''
import shlex
import datetime
import subprocess
import time
  
def execute_command(cmdstring, cwd = None , timeout = None , shell = False ):
   """執行一個SHELL命令
       封裝了subprocess的Popen方法, 支持超時判斷,支持讀取stdout和stderr
       參數:
     cwd: 運行命令時更改路徑,若是被設定,子進程會直接先更改當前路徑到cwd
     timeout: 超時時間,秒,支持小數,精度0.1秒
     shell: 是否經過shell運行
   Returns: return_code
   Raises: Exception: 執行超時
   """
   if shell:
     cmdstring_list = cmdstring
   else :
     cmdstring_list = shlex.split(cmdstring)
   if timeout:
     end_time = datetime.datetime.now() + datetime.timedelta(seconds = timeout)
   
   #沒有指定標準輸出和錯誤輸出的管道,所以會打印到屏幕上;
   sub = subprocess.Popen(cmdstring_list, cwd = cwd, stdin = subprocess.PIPE,shell = shell,bufsize = 4096 )
   
   #subprocess.poll()方法:檢查子進程是否結束了,若是結束了,設定並返回碼,放在subprocess.returncode變量中
   while sub.poll() is None :
     time.sleep( 0.1 )
     if timeout:
       if end_time < = datetime.datetime.now():
         raise Exception( "Timeout:%s" % cmdstring)
       
   return str (sub.returncode)
  
if __name__ = = "__main__" :
   print execute_command( "ls" )

也能夠在Popen中指定stdin和stdout爲一個變量,這樣就能直接接收該輸出變量值。spa

總結.net

在python中執行SHELL有時候也是很必須的,好比使用Python的線程機制啓動不一樣的shell進程,目前subprocess是Python官方推薦的方法,其支持的功能也是最多的,推薦你們使用。線程

好了,以上就是這篇文章的所有內容了,但願本文的內容對你們的學習或者工做能帶來必定的幫助,若是有疑問你們能夠留言交流。code

 

原文連接:http://www.crazyant.net/1319.html

相關文章
相關標籤/搜索