如何使用Python執行Shell命令並獲取執行過程信息

本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述:

一、執行Shell命令

Python內置的subprocess模塊可以方便地執行Shell命令。使用subprocess模塊的方法如下:

import subprocess

subprocess.run(["ls", "-l"]) # 執行ls -l命令

上述代碼中,subprocess.run()可以執行帶參數的命令,命令和參數作為列表傳入。執行結果以CompletedProcess對象的形式返回。

二、獲取執行結果

Subprocess模塊提供了多種方式獲取執行結果,如通過標準輸出、標準錯誤輸出和返回值等。下面分別介紹:

1. 通過標準輸出獲取執行結果

可以通過subprocess.run()的stdout參數來獲取執行結果。例如:

import subprocess

result = subprocess.run(["ls", "-l"], stdout=subprocess.PIPE)
print(result.stdout.decode())

上述代碼中,指定stdout=subprocess.PIPE可以將標準輸出返回給調用者,然後通過result.stdout獲取執行結果,並將其以字符串形式打印出來。

2. 通過標準錯誤輸出獲取執行結果

同樣可以通過subprocess.run()的stderr參數獲取執行結果,例如:

import subprocess

result = subprocess.run(["ls", "-l", "nonexistent"],
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)

print(result.stderr.decode())

上述代碼中,由於指定的目錄不存在,程序執行會出現錯誤。我們通過stderr=subprocess.PIPE指定標準錯誤輸出,然後通過result.stderr獲取錯誤信息,並將其以字符串形式打印出來。

3. 通過返回值獲取執行結果

可以通過subprocess.run()的returncode屬性來獲取命令的返回值。例如:

import subprocess

result = subprocess.run(["ls", "-l", "nonexistent"])

print("return code:", result.returncode)

上述代碼中,由於指定的目錄不存在,程序執行會返回錯誤碼。我們通過result.returncode獲取錯誤碼,並將其輸出。

三、更加高級的用法

有時候,我們需要更複雜的命令行操作,比如進程間通信、輸入輸出重定向等。在這種情況下,我們可以使用更加高級的用法。

1. 通過管道傳遞數據

下面的示例演示如何通過管道將數據傳遞給命令行:

import subprocess

# execute echo 'hello world' | wc command
with subprocess.Popen(["echo", "hello world"], stdout=subprocess.PIPE) as echo:
    with subprocess.Popen(["wc", "-w"], stdin=echo.stdout, stdout=subprocess.PIPE) as wc:
        result = wc.communicate()

print(result[0].decode())

上述代碼中,我們使用了兩個子進程。首先執行echo “hello world”命令,並通過stdout=subprocess.PIPE將標準輸出發送到子進程的標準輸入。然後通過stdin=echo.stdout,將管道從第一個子進程傳遞給第二個子進程。注意,使用with語句可以確保進程安全地關閉。

2. 輸入輸出重定向

下面的示例演示如何重定向子進程的標準輸入、標準輸出和標準錯誤輸出:

import subprocess

# execute echo 'hello world' > hello.txt command
with open("hello.txt", "w") as file:
  subprocess.run(["echo", "hello world"], stdout=file)

# execute cat < hello.txt command
with open("hello.txt", "r") as file:
    subprocess.run(["cat"], stdin=file)

# execute ls -ld /nonexistent > nonexist.txt 2>&1
with open("nonexist.txt", "w") as file:
    subprocess.run(["ls", "-ld", "/nonexistent"],
                       stdout=file,
                       stderr=subprocess.STDOUT)

上述代碼中,第一個示例演示了如何將標準輸出重定向到文件中。第二個示例演示了如何將文件內容作為標準輸入傳遞給子進程。第三個示例演示了如何重定向標準錯誤輸出。

四、總結

使用Python執行Shell命令並獲取執行過程信息可以用一個非常簡單的接口完成,同時具有很強的實用性。我們可以通過subprocess模塊輕鬆地執行Shell命令,並獲取執行過程中的各種信息。同時,subprocess模塊還提供了很多高級特性,方便處理更高級的命令行操作。

原創文章,作者:HGHNA,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/374485.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HGHNA的頭像HGHNA
上一篇 2025-04-27 15:27
下一篇 2025-04-28 13:17

相關推薦

  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • 如何使用Python獲取某一行

    您可能經常會遇到需要處理文本文件數據的情況,在這種情況下,我們需要從文本文件中獲取特定一行的數據並對其進行處理。Python提供了許多方法來讀取和處理文本文件中的數據,而在本文中,…

    編程 2025-04-29
  • 如何使用jumpserver調用遠程桌面

    本文將介紹如何使用jumpserver實現遠程桌面功能 一、安裝jumpserver 首先我們需要安裝並配置jumpserver。 $ wget -O /etc/yum.repos…

    編程 2025-04-29
  • Hibernate註解聯合主鍵 如何使用

    解答:Hibernate的註解方式可以用來定義聯合主鍵,使用@Embeddable和@EmbeddedId註解。 一、@Embeddable和@EmbeddedId註解 在Hibe…

    編程 2025-04-29
  • 如何使用Python讀取CSV數據

    在數據分析、數據挖掘和機器學習等領域,CSV文件是一種非常常見的文件格式。Python作為一種廣泛使用的編程語言,也提供了方便易用的CSV讀取庫。本文將介紹如何使用Python讀取…

    編程 2025-04-29
  • 如何使用HTML修改layui內部樣式影響全局

    如果您想要使用layui來構建一個美觀的網站或應用,您可能需要使用一些自定義CSS來修改layui內部組件的樣式。然而,修改layui組件的樣式可能會對整個頁面產生影響,甚至可能破…

    編程 2025-04-29
  • 如何使用random生成不重複的隨機數

    在編程開發中,我們經常需要使用隨機數來模擬一些場景或生成一些數據。但是如果隨機數重複,就會造成數據的不準確性。這時我們就需要使用random庫來生成不重複且隨機的數值。下面將從幾個…

    編程 2025-04-29
  • 如何使用GPU加速運行Python程序——以CSDN為中心

    GPU的強大性能是眾所周知的。而隨着深度學習和機器學習的發展,越來越多的Python開發者將GPU應用於深度學習模型的訓練過程中,提高了模型訓練效率。在本文中,我們將介紹如何使用G…

    編程 2025-04-29
  • 如何使用Python導入Random庫

    Python是一門優秀的編程語言,它擁有豐富的第三方庫和模塊。其中,Random庫可謂是最常用的庫之一,它提供了用於生成隨機數的功能。對於開發人員而言,使用Random庫能夠提高開…

    編程 2025-04-29
  • 理解agentmain方法如何使用

    如果你不清楚如何使用agentmain方法,那麼這篇文章將會為你提供全面的指導。 一、什麼是agentmain方法 在Java SE 5.0中,Java提供了一個機制,允許程序員在…

    編程 2025-04-29

發表回復

登錄後才能評論