python呼叫linux命令的方法

2021-10-01 08:28:40 字數 3510 閱讀 7121

1. os 模組

1.1. os模組的exec方法族

python的exec系統方法同unix的exec系統呼叫是一致的。這些方法適用於在子程序中呼叫外部程式的情況,因為外部程式會替換當前程序的**,不會返回。

1.2. os模組的system方法

system方法會建立子程序執行外部程式,方法只返回外部程式的執行結果。這個方法比較適用於外部程式沒有輸出結果的情況。

import os

os.system(「echo 「hello world」」) # 直接使用os.system呼叫乙個echo命令

hello world ——————> 列印命令結果

0 ——————> 命令執行結果,而不是輸出結果

val = os.system("ls -al | grep 「log」 ") # 使用val接收返回值

-rw-r–r-- 1 root root 6030829 dec 31 15:14 log ——————> 此時只列印了命令結果

print val

0 ——————> 注意,此時命令正常執行時,返回值是0

val = os.system("ls -al | grep 「log1」 ")

print val

256

1.3. os模組的popen方法

當需要得到外部程式的輸出結果時,本方法非常有用,返回乙個類檔案物件,呼叫該物件的read()或readlines()方法可以讀取輸出內容。比如使用urllib呼叫web api時,需要對得到的資料進行處理。os.popen(cmd) 要得到命令的輸出內容,只需再呼叫下read()或readlines()等 如a=os.popen(cmd).read()

os.popen(『ls -lt』) # 呼叫os.popen(cmd)並不能得到我們想要的結果

print os.popen(『ls -lt』).read() # 呼叫read()方法可以得到命令的結果

total 6064

-rwxr-xr-x 1 long long 23 jan 5 21:00 hello.sh

-rw-r–r-- 1 long long 147 jan 5 20:26 makefile

drwxr-xr-x 3 long long 4096 jan 2 19:37 test

-rw-r–r-- 1 root root 6030829 dec 31 15:14 log

drwxr-xr-x 2 long long 4096 dec 28 09:36 pip_build_long

drwx------ 2 debian-gdm debian-gdm 4096 dec 23 19:08 pulse-gylj5el24gu9

drwx------ 2 long long 4096 jan 1 1970 orbit-long

commands 模組

使用commands模組的getoutput方法,這種方法同popend的區別在於popen返回的是乙個類檔案物件,而本方法將外部程式的輸出結果當作字串返回,很多情況下用起來要更方便些。

主要方法:

import commands

commands.getstatusoutput(『ls -lt』) # 返回(status, output)

(0, 『total 5900\n-rwxr-xr-x 1 long long 23 jan 5 21:34 hello.sh\n-rw-r–r-- 1 long long 147 jan 5 21:34 makefile\n-rw-r–r-- 1 long long 6030829 jan 5 21:34 log』)

commands.getoutput(『ls -lt』) # 返回命令的輸出結果(貌似和shell命令的輸出格式不同哈~)

『total 5900\n-rwxr-xr-x 1 long long 23 jan 5 21:34 hello.sh\n-rw-r–r-- 1 long long 147 jan 5 21:34 makefile\n-rw-r–r-- 1 long long 6030829 jan 5 21:34 log』

commands.getstatus(『log』) # 呼叫commands.getoutput中的命令對』log』檔案進行相同的操作

『-rw-r–r-- 1 long long 6030829 jan 5 21:34 log』

from subprocess import call

call([「ls」, 「-l」])

subprocess與system相比的優勢是它更靈活(你可以得到標準輸出,標準錯誤,「真正」的狀態**,更好的錯誤處理,等…)

各方法的比較以及總結

4.1. 關於 os.system 

os.system(「some_command with args」)將命令以及引數傳遞給你的系統shell,這很好,因為你可以用這種方法同時執行多個命令並且可以設定管道以及輸入輸出重定向。比如:

os.system(「some_command < input_file | another_command > output_file」)

然而,雖然這很方便,但是你需要手動處理shell字元的轉義,比如空格等。此外,這也只能讓你執行簡單的shell命令而且不能執行外部程式。

4.2. 關於os.popen

使用stream = os.popen(「some_command with args」)也能做與os.system一樣的事,與os.system不同的是os.popen會給你乙個像檔案的物件從而你可以使用它來訪問哪個程式的標準輸入、輸出。而且popen還有三個變種都是在i/o處理上有輕微不同。假如你通過乙個字串傳遞所有東西,你的命令會傳遞給shell;如果你通過乙個列表傳遞他們,你不用擔心逃避任何事。

4.3. 關於subprocess.popen

subprocess模組的popen類,意圖作為os.popen的替代,但是因為其很全面所以比os.popen要顯得稍微複雜。

比如你可以使用  print popen(「echo hello world」, stdout=pipe, shell=true).stdout.read()  來替代  print os.popen(「echo hello world」).read()。但是相比之下它使用乙個統一的類包括4中不同的popen函式還是不錯的。

4.4. 關於subprocess.call

subprocess模組的call函式。它基本上就像popen類並都使用相同的引數,但是它只簡單的等待命令完成並給你返回**。比如:

python呼叫呼叫Linux命令

下面 演示了呼叫乙個shell命令,其中,命令的輸出會儲存到result變數中,而命令的返回值,則儲存到exitcode中,由此可見,呼叫shell命令還是很方便的 import commands exitcode,result commands.getstatusoutput dir print ...

Python中如何呼叫Linux命令

一 使用os模組 in 1 import os 匯入os模組 in 2 os.system ls anaconda ks.cfg epel release 7 5.noarch.rpm ipython 4.1.2 ipython 4.1.2.tar.gz pip 8.1.2 pip 8.1.2.ta...

python 呼叫系統命令

使用 os.system 呼叫系統命令 程式中無法獲得到輸出和返回值 import os os.system ls l proc cpuinfo os.system ls l proc cpuinfo r r r 1 root root 0 3月 29 16 53 proc cpuinfo 0使用 ...