[python基礎] python與s

一、概述

python與shell交互的方式有一下幾種: os.system() os.popen() commands包 subprocess包

二、os包

  1. os.system([cmd])
    1. 執行CMD,返回CMD的狀態碼(0 – 成功,其他 – 失敗或被中斷)
    2. 無管道
  2. os.popen([CMD], [mode = 'r' | 'w' ], buffersize)
    1. 開啟子shell執行CMD,返回執行命令的輸入流輸出流文件對象。文件對象可讀寫,但只能進行讀或寫
    2. 底層通過os管道技術 實現
    3. 單向管道(只能讀或寫) import os #使用讀通道 f = os.popen("ls -l")# 執行此語句後,將創建子shell運行參數中指定的命令,但是不阻塞父進程 f.read()# 執行讀取操作時,將阻塞父進程 #使用寫管道 #需要提前寫好echo文件 ''' #echo.py while True: in = input() if in == "quit" or in == "exit": print("Bye") break print("[-] ", in) ''' f = os.popen("python echo.py", "w") f.write("hello")

三、subprocess包

  1. subprocess 模塊通過os 底層的 管道技術 實現
  2. 模塊提出的目標是替代:os.systemos.spawn*
  3. 函數
    1. call(*popenargs, timeout= None, **kwargs)
      1. 功能:調用子進程運行命令
      2. 返回值:0 或 非0值
      3. 阻塞父進程,直到該函數結束
      4. 結束條件:命令執行完成或超時
      5. 用於代替 os.system()
      6. 不支持管道
    2. check_call(*popenargs, **kwargs)
      1. 功能:檢查在子進程中運行命令的執行情況
      2. 返回值:0。(命令退出碼為0時,返回0;否則,無返回值,直接引發CalledProcessError異常)
      3. 阻塞父進程,直到該函數結束
      4. 結束條件: 命令執行完成超時
      5. 不支持管道
    3. check_output(*popenargs, timeout=None, **kwargs)
      1. 功能: 檢查在子進程中運行命令
      2. 返回值: 程序的運行結果。(如果命令返回碼為0,返回運行結果;否則,直接拋出CalledProcessError異常)
      3. 不阻塞父進程
      4. 不支持stdout的管道
      5. 指定參數:stderr = STDOUT 可捕獲錯誤信息
      6. 支持參數:input
    4. getoutput(cmd)
      1. 功能: 獲取子進程中執行命令的輸出結果
      2. 返回值:執行命令的結果
      3. 不阻塞父進程
      4. 不支持管道
      5. 命令執行錯誤時,不引發異常
    5. getstatusoutput(cmd)
      1. 功能:獲取子進程中執行命令的返回碼和結果
      2. 返回值:(retcode, stdout)元組
      3. 不阻塞父進程
      4. 不支持管道
      5. 命令執行錯誤時,不引發異常
    6. run(args, *, stdin = None, input = None, stderr = None, shell = False, cwd = None, timeout = None, check = False, encoding = None, errors = None)
      1. 功能:開啟子進程運行命令
      2. 不阻塞父進程
      3. 支持雙向管道
      4. 參數check為True時,可能會引發異常
      5. run函數是對Popen類封裝後形成的簡單函數