首頁 >後端開發 >Python教學 >python中執行shell的兩種方法總結

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

高洛峰
高洛峰原創
2017-02-07 17:20:041253瀏覽

一、使用python內建commands模組執行shell

commands對Python的os.popen()進行了封裝,使用SHELL命令字串作為其參數,返回命令的結果資料以及命令執行的狀態;

該命令目前已經廢棄,被subprocess取代;

# 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"))

二、使用python最新的subprocess模組執行shell

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

subprocess允許你能創建很多子進程,創建的時候能指定子進程和子進程的輸入、輸出、錯誤輸出管道,執行後能獲取輸出結果和執行狀態。

# 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為一個變量,這樣就能直接接收該輸出變數值。

總結

在python中執行SHELL有時候也是很必須的,例如使用Python的線程機制啟動不同的shell進程,目前subprocess是Python官方推薦的方法,其支援的功能也是最多的,推薦大家使用。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或工作能帶來一定的幫助,如果有疑問大家可以留言交流。

更多python中執行shell的兩種方法總結相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn