Python中os.system()、subprocess.run()、call()、check_output()的用法

来源:https://www.cnblogs.com/djdjdj123/archive/2023/07/06/17533264.html
-Advertisement-
Play Games

### 1.os.system() os.system() 是對 C 語言中 system() 系統函數的封裝,允許執行一條命令,並返回退出碼(exit code),命令輸出的內容會直接列印到屏幕上,無法直接獲取。 示例: ```python # test.py import os os.syste ...


1.os.system()

os.system() 是對 C 語言中 system() 系統函數的封裝,允許執行一條命令,並返回退出碼(exit code),命令輸出的內容會直接列印到屏幕上,無法直接獲取。

示例:

# test.py
import os
os.system("ls -l | grep test")    # 允許管道符

# 測試執行
$ ll                <======== 列出當前目錄中的內容
drwxr-xr-x 2 foo foo 4096 Feb 13 09:09 __pycache__
-rw-r--r-- 1 foo foo  359 Feb 19 09:21 test.py
$ python test.py
-rw-r--r-- 1 foo foo  359 Feb 19 09:21 test.py    <======== 只有名字包含 test 的文件被列出

2.subprocess.run()

Python 3.5 開始推薦使用這個方法執行命令,其原型如下:

subprocess.run(
    args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, 
    shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, 
    text=None, env=None, universal_newlines=None
)

其中:

  • args: 可以是一個字元串(當 shell=True 時),也可以是一個列表(當 shell=False 時)

  • stdin, stdout, stderr: 用於指定標準IO文件句柄,可以是:

      subprocess.PIPE: 用作 stdout, stderr 參數的值時,可以從返回值對象中的 stdout 和 stderr 屬性中讀取輸出內容
      subprocess.STDOUT: 用作 stderr 參數的值時,相當於把標準錯誤重定向到標準輸入中)
      subprocess.DEVNULL: 用作 stdout, stderr 參數的值時,相當於把輸出內容重定向到 /dev/null
      用戶已經打開的文件對象或描述符(整型數字)
    
  • capture_output: 當設置為 True 時,相當於 stdout 和 stderr 參數都設置為 True 了,可以通過返回值對象訪問標準輸出和標準錯誤內容

  • shell: 當設置為 True 時,args 參數會當做一條命令字元串(支持管道、重定向操作);當它為 False 時,args 需是一個列表(並且不支持管道、重定向操作)

  • cwd: 指定執行命令的目錄,預設為當前目錄

  • timeout: 指定命令執行超時時間(按妙計),若執行超時了,會 kill 掉命令並拋出 TimeoutExpired 異常

  • check: 當設置為 True 時,會自動檢測執行退出碼,若不為0,則拋出 CalledProcessError 異常

  • text: 當設置為 True 時,stdin、stdout、stderr 會以“文本”模式打開(返回值對象中的 stdout、stderr 存儲文本內容),否則返回值對象中 stdout、stderr 存儲的是位元組序列

  • env: 用於設置程式執行時繼承的環境變數等,預設與當前進程相同

該方法返回一個 CompletedProcess 對象,其中包含以下屬性:

  • returncode: 執行命令的退出碼
  • stdout: 捕獲的標準輸出內容(當 stdout 參數為 PIPE 時)。其格式預設為位元組序列,除非 text 參數為 True (此時為文本格式)。
  • stderr: 捕獲的標準錯誤內容(當 stderr 參數為 PIPE 時)。其格式預設為位元組序列,除非 text 參數為 True (此時為文本格式)。
  • args: 同參數 args 。

示例:

import subprocess
subprocess.run(["ls", "-l"])            # 預設時,args 參數需是一個列表
subprocess.run("ls -l", shell=True)     # 當 shell 為 True 時,args 是一個字元串
ret = subprocess.run("ls -l", shell=True, capture_output=True, text=True) # 以文本模式捕獲輸出內容
print("Return code:", ret.returncode)   # Return code: 0
print("STDOUT:", ret.stdout)            # STDOUT: ...當前目錄內容...
print("STDERR:", ret.stderr)            # STDERR: <空>
ret = subprocess.run("abcdefg", shell=True, text=True,  # 註意:這裡必須 shell=True 才能捕獲到 /bin/sh 的輸出錯誤
        # 當 shell=False 時,是要去捕獲 "abcdefg" 命令自身輸出的內容,但是它不存在,python 會報錯
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT    # 標準錯誤重定向到標準輸出
) 
print("STDOUT:", ret.stdout)            # STDOUT: /bin/sh: abcdefg: command not found

另一個用於測試 shell 參數區別的示例如下:

import sys, re, subprocess
if len(sys.argv) == 1:  # parent process
    cmd = ["python", sys.argv[0], "--run-child"]
    
    ret = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    print(ret) # CompletedProcess(args=['python', 'test.py', '--run-child'], returncode=0, stdout='stdout output\n', stderr='stderr output')
    assert re.match("stdout output", ret.stdout)
    assert re.match("stderr output", ret.stderr)    # 如果 cmd 中的命令不存在,這裡是捕獲不到的,subprocess.run()自己就會報錯
    
    ret = subprocess.run(" ".join(cmd), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    print(ret) # CompletedProcess(args='python test.py --run-child', returncode=0, stdout='stdout output\n', stderr='stderr output')
    assert re.match("stdout output", ret.stdout)
    assert re.match("stderr output", ret.stderr)    # 如果 cmd 中的命令不存在,這裡也是可以捕獲到的,內容可能是 xxx command not found
    
    print("Passed!")
else:                   # child process
    print("stdout output")
    sys.stderr.write("stderr output")

3.subprocess.call()

Python 3.5 以前(包括 2.x 版本)沒有 subprocess.run() 方法,可以使用 subprocess.call() 來執行命令,該方法原型如下:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)

註意:這個方法的返回值是命令的退出碼,而不是一個對象,所以無法像 subprocess.run() 一樣捕獲命令輸出內容(不要設置 stdout=PIPE 或 stderr=PIPE,否則可能造成命令卡死)。

該方法的其它參數與 subprocess.run() 類似。

4.subprocess.check_output()

Python 3.5 以前的版本,要想捕獲命令輸出內容,可以使用 subprocess.check_output() 方法,它的原型如下:

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None)

註意:參數中沒有 stdout ,因為這個函數的返回值預設就是標準輸出內容,也可以將設置 stderr=subprocess.STDOUT 將標準錯誤重定向到標準輸出,但是好像沒有辦法單獨捕獲標準錯誤內容呢!

示例:

import sys, re, subprocess
#Python小白學習交流群:711312441
if len(sys.argv) == 1:  # parent process
    cmd = ["python", sys.argv[0], "--run-child"]
    ret = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
    print("[" + ret + "]")  # 輸出內容中包含標準輸出和標準錯誤,輸出順序在 windows 下和 linux 下可能會有差異
    assert re.search("stdout output", ret)
    assert re.search("stderr output", ret)
    print("Passed!")
else:                   # child process
    print("stdout output")
    sys.stderr.write("stderr output")

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 大促備戰,最大的隱患項之一就是慢sql,帶來的破壞性最大,也是日常工作中經常帶來整個應用抖動的最大隱患,而且對sql好壞的評估有一定的技術要求,有一些缺乏經驗或者因為不夠仔細造成一個壞的sql成功走到了線上,等發現的時候要麼是造成了線上影響、報警、或者後置的慢sql採集發現,這時候一般無法快速止損,... ...
  • 摘要:2023可信資料庫發展大會上,華為雲資料庫服務產品部總經理蘇光牛圍繞華為雲GaussDB的產品能力和實踐進行了分享 本文分享自華為雲社區《華為雲GaussDB亮相2023可信資料庫發展大會,榮獲三項評測證書!》,作者: GaussDB 資料庫。 近日,由中國信息通信研究院、中國通信標準化協會指 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230704144741811-1382373830.png) # 1. 術語的定義 ## 1.1. 服務 ### 1.1.1. 指共同協作、以單元的形式對外提供功能的跨機器進 ...
  • 一般發生在程式開始部分: `from pymodbus.client.sync import ModbusSerialClient` `from pymodbus.payload import BinaryPayloadDecoder` `from pymodbus.constants import ...
  • # Java 構造器 # 1. 構造器 ## 構造器也叫構造方法,是用來完成對象的初始化。 ## 構造器的定義: > ## 構造器的定義:[訪問修飾符] 方法名(形參),構造器與方法不同,並沒有返回值,也不能寫void,訪問修飾符可以是不同的,方法名要與本類的類名相同 > > ## 構造器的調用是由 ...
  • ### 1 .讓自己習慣C++ #### 條款01 視C++為一個語言聯邦 * `C` * `Object-Oriented C++` * `Template C++` * `STL` * `C++`高效編程守則視情況而變化,取決於你使用`C++`的哪一部分。 #### 條款02 儘量與const, ...
  • **startswith()方法** startswith() 方法用於檢索字元串是否以指定字元串開頭,如果是返回 True;反之返回 False。 **endswith()方法** endswith() 方法用於檢索字元串是否以指定字元串結尾,如果是則返回 True;反之則返回 False ``` ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...