Python調用外部系統命令

来源:https://www.cnblogs.com/python1111/archive/2023/06/18/17489223.html
-Advertisement-
Play Games

利用Python調用外部系統命令的方法可以提高編碼效率。調用外部系統命令完成後可以通過獲取命令執行返回結果碼、命令執行的輸出結果進行進一步的處理。本文主要描述Python常見的調用外部系統命令的方法,包括os.system()、os.popen()、subprocess.Popen()等。 本文分析 ...


利用Python調用外部系統命令的方法可以提高編碼效率。調用外部系統命令完成後可以通過獲取命令執行返回結果碼、命令執行的輸出結果進行進一步的處理。本文主要描述Python常見的調用外部系統命令的方法,包括os.system()、os.popen()、subprocess.Popen()等。

本文分析python調用外部系統命令主要從兩個方面考慮:
1、是不是可以返回命令執行結果碼,因為大部分場景都需要通過判斷調用命令是執行成功還是失敗。
2、是不是可以獲取命令執行結果。某些場景調用外部命令就是為獲取輸出結果,也可以通過輸出結果來判斷命令執行成功還是失敗。分析結果如下:

在這裡插入圖片描述
下麵再針對每一個函數使用方法和實例進行詳細描述。

1、subprocess模塊

優先介紹subprocess模塊的是由於該模塊可以替代舊模塊的方法,如os.system()、os.popen()等,推薦使用。subporcess模塊可以調用外部系統命令來創建新子進程,同時可以連接到子進程的nput/output/error管道上,並得到子進程的返回值。

subprocess模塊主要有call()、check_call()、check_output()、Popen()函數,簡要描述如下:

Main API
    ========
    call(...): Runs a command, waits for it to complete, then returns the return code.
    check_call(...): Same as call() but raises CalledProcessError() if return code is not 0
    check_output(...): Same as check_call() but returns the contents of stdout instead of a return code
    Popen(...): A class for flexibly executing a command in a new process
    
    Constants
    ---------
    PIPE:    Special value that indicates a pipe should be created
    STDOUT:  Special value that indicates that stderr should go to stdout

下麵開始介紹subprocess函數的使用方法。

(1)subprocess.Popen類

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)  

參數說明:

  • args:
    要調用的外部系統命令。
  • bufsize:
    預設值為0, 表示不緩存,。為1表示行緩存,。其他正數表示緩存使用的大小,,負數-1表示使用系統預設的緩存大小。
  • stdin、stdout、stdout
    分別表示標準輸入、標準輸出和標準錯誤。其值可以為PIPE、文件描述符和None等。預設值為None,表示從父進程繼承。
  • shell
    Linux:參數值為False時,Linux上通過調用os.execvp執行對應的程式。為Trule時,Linux上直接調用系統shell來執行程式。
    Windows:shell參數表示是否使用bat作為執行環境。只有執行windows的dir、copy等命令時才需要設置為True。其他程式沒有區別。
  • executable
    用於指定可執行程式。一般情況下我們通過args參數來設置所要運行的程式。如果將參數shell設為 True,executable將指定程式使用的shell。在windows平臺下,預設的shell由COMSPEC環境變數來指定。
  • preexec_fn
    只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行之前被調用
  • cwd
    設置子進程當前目錄
  • env
    env是字典類型,用於指定子進程的環境變數。預設值為None,表示子進程的環境變數將從父進程中繼承。
  • Universal_newlines
    不同操作系統下,文本的換行符是不一樣的。如:windows下用’/r/n’表示換,而Linux下用 ‘/n’。如果將此參數設置為True,Python統一把這些換行符當作’/n’來處理。

Popen對象對應的屬性和方法如下:

屬性:

  stdin, stdout, stderr, pid, returncode

方法:

  communicate(self, input=None) -> returns a tuple (stdout, stderr).
  wait(self) -> Wait for child process to terminate.  Returns returncode attribute.

常用實例

1、列印D:\temp目錄下創建test目錄。直接調用進程,不考慮獲取調用命令輸出內容和結果碼

import subprocess

p = subprocess.Popen(args='mkdir test', shell=True, cwd='d:/temp')
p.wait()

2、調用ping命令執行,獲取命令執行輸出內容

import subprocess

p = subprocess.Popen(args='ping -n 2 -w 3 192.168.1.104', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
p.wait()
print (p.stdout.read())

明:p.stdout、p.stdin、p.stderr為文件對象,可以使用文件對象函數,如read()。

2)subprocess.call()

函數原型:call(*popenargs, **kwargs)。call()調用外部系統命令執行,並返回程式執行結果碼。

import subprocess

retcode = subprocess.call('ping -n 2 -w 3 192.168.1.104', shell=True)
print (retcode)

(3)subprocess.check_call()

使用方法同call()。如果調用命令執行成功,返回結果碼0,如果執行失敗,拋出CalledProcessError.異常。

舉例如下:

>>> p = subprocess.check_call('ping -n 2 -w 3 192.168.1.105', shell=True)

正在 Ping 192.168.1.105 具有 32 位元組的數據:
請求超時。
請求超時。

192.168.1.105 的 Ping 統計信息:
    數據包: 已發送 = 2,已接收 = 0,丟失 = 2 (100% 丟失),
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\Python27\lib\subprocess.py", line 186, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'ping -n 2 -w 3 192.168.1.105' returned non-zero exit status 1

(4)subprocess.check_output()

函數原型:check_output(*popenargs, **kwargs)。用法與call()相同。區別是如果執行成功返回的是標準輸出內容。如果失敗,拋CalledProcessError.異常。

import subprocess

output = subprocess.check_output('ping -n 2 -w 3 192.168.1.104', shell=True)
print(output)

2、os模塊

(1)os.system()

os.system(command) 。調用外部系統命令,返回命令結果碼,但是無法獲取命令執行輸出結果,輸出結果直接列印到屏幕終端。

import os

retcode = os.system('ping -n 2 -w 3 192.168.1.104')
if retcode == 0:
    print ("%s Success" % (ip,))
else:
    print ("%s Fail" % (ip,))

(2)os.popen()

os.popen(command) 。調用外部系統命令,返回命令執行輸出結果,但不返回結果嗎

import os

#學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
output = os.popen('ping -n 2 -w 3 192.168.1.104')
print (output)

3、commands模塊

commands模塊用於調用Linux shell命令。測試了下在windows上執行失敗。主要有如下3個函數

getoutput(cmd): Return output (stdout or stderr) of executing cmd in a shell.
getstatus(file):Return output of "ls -ld <file>" in a string.
getstatusoutput(cmd):Return (status, output) of executing cmd in a shell.

使用實例如下:

import commands

retcode, output = commands.getstatusoutput('ping -n 2 -w 3 192.168.1.104')
print (retcode)
print (output)

總結

在編寫程式時可根據使用場景來選擇不同的Python調用方法來執行外部系統命令。對於複雜的命令考慮使用subprocess.Popen()完成,如果僅是簡單的命令執行,可以使用os.system()完成,如調用windows的暫停程式命令os.system('pause')。


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

-Advertisement-
Play Games
更多相關文章
  • 原生模式下, 服務端通過 @ServerEndpoint 實現其對應的 @OnOpen, @OnClose, @OnMessage, @OnError 方法, 客戶端創建 WebSocketClient 實現對應的 onOpen(), onClose(), onMessage(), onError(... ...
  • # 集合 scala中的集合分為兩種 ,可變集合和不可變集合, 不可變集合可以安全的併發的訪問! 集合的類主要在一下兩個包中 - 可變集合包 scala.collection.mutable - 不可變集合包 scala.collection.immutable 預設的 Scala 不可變集合,就是 ...
  • # Go 語言之 Shutdown 關機和fvbock/endless 重啟 Shutdown 源碼 ```go // Shutdown gracefully shuts down the server without interrupting any // active connections. ...
  • **描述** 給定一個非負整數數組,統計裡面每一個數的出現次數。我們只統計到數組裡最大的數。 假設 Fmax (Fmax using namespace std; int main(){ int n,x; int fmax=0;//數組裡最大的數 int a[10000]={0}; cin>>n; ...
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第18面: > 面試官:`std::string`用過吧? > > 二師兄:當然用過(廢話,C++程式員就沒有沒用過`std::string`的)。 > > 面試官:`std::string("hello")+"world"`、`"hello"+st ...
  • 使用 QCustomPlot 繪圖庫輔助開發時整理的學習筆記。本篇介紹 QCustomPlot 的一種使用方法,通過包含源碼的方式進行使用,這也是最常用的方法,示例中使用的 QCustomPlot 版本為 Version 2.1.1。 ...
  • # Java 變數與基本數據類型 # 1. 變數是保存特定數據類型的值。變數必須先聲明,後使用。變數表示記憶體中的一個存儲區域。變數在同一個域中不可出現相同的變數名。 ## # 2. 程式中 + 號的作用 > ## 如果兩邊都是數值,進行加法運算 > > ## 如果左右一邊有一方位字元串,則做拼接字元 ...
  • > 我們之前對Redis的學習都是在命令行視窗,那麼如何使用Java來對Redis進行操作呢?對於Java連接Redis的開發工具有很多,這裡先介紹通過Jedis實現對Redis的各種操作。(前提是你的redis已經配置了遠程訪問) ## 1.創建一個maven工程,並且添加以下依賴 ~~~xml ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...