Python 執行 Linux 作業系統命令

wpgy發表於2019-09-26

在開發運維指令碼過程中,經常需要執行一些作業系統命令,常用方法如下:

1、使用 os.system

>>> import os

>>> cmd = 'ls /'

>>> res = os.system(cmd)
bin  boot  data  dev  etc  home  lib  lib64  media  mnt  opt  oracle  proc  root  run  sbin  srv  sys  tmp  usr  var
>>> print(res)
0

特點:

(1)Python 內建方法,執行成功返回 0,並在標準輸出列印命令執行結果

(2)不能返回命令的執行結果


2、使用 commands.getstatusoutput

>>> import os commands

>>> cmd = 'ls /'

>>> status,output = commands.getstatusoutput(cmd)

status 為命令執行的狀態,成功返回 0 ,出錯返回非 0 值;

output 是命令的執行結果

特點:

(1)commands 只能在 Python2.x 版本使用,而且並不是每一個 Python2.x 版本 都自帶了該模組;

(2)commands 包在 Python3 中已經廢棄


3、使用 subprocess.Popen

>>> from subprocess import Popen, PIPE
>>> process = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
>>> stdout, stderr = process.communicate()

stdout 為命令執行結果,stderr 為命令錯誤資訊。注意,某些命令即便執行成功,也會有錯誤提示資訊,但不影響結果。

特點:

(1)Python2.x 和 Python3.x 內建模組

(2)可以同時返回命令執行結果和錯誤資訊

(3)可以獲取到命令的退出碼


綜上,推薦使用第三種方法。

一個執行作業系統命令的函式可以封裝如下,支援基於互信的遠端節點命令執行,返回標註輸出、標註錯誤和退出碼

from subprocess import Popen, PIPE

def exec_command(shell_cmd, hostname=None):
    if hostname:
        p = Popen('/usr/bin/ssh -Tq '+hostname, shell=True, stdout=PIPE, stdin=PIPE)
        p.stdin.write(str.encode(shell_cmd))
        p.stdin.flush()
    else:
        p = Popen(shell_cmd, shell=True, stdout=PIPE, stdin=PIPE)
    stdout, stderr = p.communicate()
    if stdout:
        stdout = stdout.decode()
    if stderr:
        stderr = stderr.decode()
    return stdout, stderr, p.poll()

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31560527/viewspace-2658443/,如需轉載,請註明出處,否則將追究法律責任。

相關文章