【Python】執行系統命令的常見用法

leixue0906發表於2015-09-30
本文總結了使用Python 程式執行系統的幾種命令,介紹各個模組的優缺點。
os.system模組
僅僅在一個子終端執行系統命令,而不能獲取命令執行後的返回資訊,如果在命令列下執行,結果直接列印出來
  1. Python 2.6.6 (r266:84292, May 29 2014, 05:49:27)
  2. [GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
  3. Type "help", "copyright", "credits" or "license" for more information.
  4. >>> import os
  5. >>> os.system('cat cont')
  6. biz_order_id
  7. out_order_id
  8. buy_nick
  9. sel_nick
  10. buyer
  11. sel
  12. 0
  13. >>> out=os.system('cat cont')
  14. biz_order_id
  15. out_order_id
  16. buy_nick
  17. sel_nick
  18. buyer
  19. sel
  20. >>>
缺點: 
a.os.system() 是新起一個shell執行命令 
b.不能利用其它變數存放os.system()執行的結果,獲得輸出等資訊比較麻煩.
c.無法控制命令執行的狀態,(如果呼叫的外部命令,掛死或者執行時間很長),主程式無法控制os.system(), 因為呼叫os.system(cmd) 呼叫程式會block,直到 os.system()命令結束自己退出。 

os.popen模組
透過 os.popen() 返回的是 file read 的物件,對其進行讀取 read() 的操作可以看到執行的輸出。
例子1
  1. >>> output = os.popen('date')
  2. >>> print output
  3. <open file 'date', mode 'r' at 0x7f7ae831e150>
  4. >>> print output.read()
  5. Sun Sep 13 22:34:56 CST 2015
例子2
  1. >>> output = os.popen('cat cont').readlines() ##返回一個陣列
  2. >>> print output
  3. ['biz_order_id\n', 'out_order_id\n', 'buy_nick\n', 'sel_nick\n', 'buyer\n', 'sel\n']
  4. >>> print output[0]
  5. biz_order_id
優點
1 該方法不但執行命令還返回執行後的資訊物件,將返回的結果賦於一變數,便於程式的處理。
缺點
1 無法獲取命令的執行結果的狀態。

commands模組
和os.system的執行方式類似,在子系統終端執行命令。該模組包含如下三種函式:
commands.getstatusoutput(cmd)
commands.getoutput(cmd) 返回命令的執行結果
commands.getstatus(file) 返回 ls -ld file 的執行結果。
  1. >>> output=commands.getoutput("date")
  2. >>> print output
  3. Sun Sep 13 22:37:44 CST 2015
  4. >>> status=commands.getstatus("date")
  5. >>> print status
  6. ls: cannot access date: No such file or directory
  7. >>> commands.getstatus('/bin/ls')
  8. '-rwxr-xr-x 1 root root 111744 May 29 2014 /bin/ls'
  9. >>> st=commands.getstatus('/bin/ls')
  10. >>> print st
  11. -rwxr-xr-x 1 root root 111744 May 29 2014 /bin/ls
  12. >>> status,output=commands.getstatusoutput("ls yy")
  13. >>> print status,output
  14. 512 ls: cannot access yy: No such file or directory
優點: 
a.容易獲得外部命令的結果輸出和命令執行的狀態 
缺點: 
b.不能利用其它變數存放os.system()執行的結果,獲得輸出等資訊比較麻煩.
c.無法控制命令執行的狀態,(如果呼叫的外部命令,掛死或者執行時間很長),主程式無法控制os.system(), 因為呼叫os.system(cmd) 呼叫程式會block,直到 os.system()命令結束自己退出。 
需要注意事的是 該模組已經在 python 3 中被廢棄了,推薦使用 subprocess代替。

subprocess 模組
執行python的時候,我們都是在建立並執行一個程式。像Linux程式那樣,一個程式可以fork一個子程式,並讓這個子程式exec另外一個程式。在Python中,透過標準庫中的subprocess包來fork一個子程式,並執行一個外部的程式。詳細資料請參考 官方文件
  1. >>> import subprocess
  2. >>> subprocess.call(["ls", "-l"])
  3. total 20
  4. -rwxr-xr-x 1 qilong.yangql users 14 Dec 30 2014 a
  5. -rw-r--r-- 1 qilong.yangql users 54 Sep 13 22:22 cont
  6. -rwxr-xr-x 1 root root 19 Jun 1 11:01 d
  7. -rw-r--r-- 1 root root 68 Jul 7 09:45 database
  8. drwxr-xr-x 3 qilong.yangql users 4096 Jan 11 2015 dbscripts
  9. 0
  10. >>> subprocess.call(["ls"])
  11. a cont d database dbscripts
  12. 0
  13. >>> Popen = subprocess.Popen(["date"])
  14. >>> Sun Sep 13 22:57:08 CST 2015
  15. >>> Popen.pid
優點
1 支援和子程式互動 
2 支援命令結果輸出
3 可以使用kill()  ,terminate() 來控制子程式退出 
4 還有很多請參考官方文件。

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

相關文章