【Python】執行系統命令的常見用法
本文總結了使用Python 程式執行系統的幾種命令,介紹各個模組的優缺點。
os.system模組
僅僅在一個子終端執行系統命令,而不能獲取命令執行後的返回資訊,如果在命令列下執行,結果直接列印出來
缺點:
a.os.system() 是新起一個shell執行命令
b.不能利用其它變數存放os.system()執行的結果,獲得輸出等資訊比較麻煩.
c.無法控制命令執行的狀態,(如果呼叫的外部命令,掛死或者執行時間很長),主程式無法控制os.system(), 因為呼叫os.system(cmd) 呼叫程式會block,直到 os.system()命令結束自己退出。
os.popen模組
透過 os.popen() 返回的是 file read 的物件,對其進行讀取 read() 的操作可以看到執行的輸出。
例子1
例子2
優點
1 該方法不但執行命令還返回執行後的資訊物件,將返回的結果賦於一變數,便於程式的處理。
缺點
1 無法獲取命令的執行結果的狀態。
commands模組
和os.system的執行方式類似,在子系統終端執行命令。該模組包含如下三種函式:
commands.getstatusoutput(cmd)
commands.getoutput(cmd) 返回命令的執行結果
commands.getstatus(file) 返回 ls -ld file 的執行結果。
優點:
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 支援和子程式互動
2 支援命令結果輸出
3 可以使用kill() ,terminate() 來控制子程式退出
4 還有很多請參考官方文件。
os.system模組
僅僅在一個子終端執行系統命令,而不能獲取命令執行後的返回資訊,如果在命令列下執行,結果直接列印出來
-
Python 2.6.6 (r266:84292, May 29 2014, 05:49:27)
-
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
-
Type "help", "copyright", "credits" or "license" for more information.
-
>>> import os
-
>>> os.system('cat cont')
-
biz_order_id
-
out_order_id
-
buy_nick
-
sel_nick
-
buyer
-
sel
-
0
-
>>> out=os.system('cat cont')
-
biz_order_id
-
out_order_id
-
buy_nick
-
sel_nick
-
buyer
-
sel
- >>>
a.os.system() 是新起一個shell執行命令
b.不能利用其它變數存放os.system()執行的結果,獲得輸出等資訊比較麻煩.
c.無法控制命令執行的狀態,(如果呼叫的外部命令,掛死或者執行時間很長),主程式無法控制os.system(), 因為呼叫os.system(cmd) 呼叫程式會block,直到 os.system()命令結束自己退出。
os.popen模組
透過 os.popen() 返回的是 file read 的物件,對其進行讀取 read() 的操作可以看到執行的輸出。
例子1
-
>>> output = os.popen('date')
-
>>> print output
-
<open file 'date', mode 'r' at 0x7f7ae831e150>
-
>>> print output.read()
- Sun Sep 13 22:34:56 CST 2015
-
>>> output = os.popen('cat cont').readlines() ##返回一個陣列
-
>>> print output
-
['biz_order_id\n', 'out_order_id\n', 'buy_nick\n', 'sel_nick\n', 'buyer\n', 'sel\n']
-
>>> print output[0]
- biz_order_id
1 該方法不但執行命令還返回執行後的資訊物件,將返回的結果賦於一變數,便於程式的處理。
缺點
1 無法獲取命令的執行結果的狀態。
commands模組
和os.system的執行方式類似,在子系統終端執行命令。該模組包含如下三種函式:
commands.getstatusoutput(cmd)
commands.getoutput(cmd) 返回命令的執行結果
commands.getstatus(file) 返回 ls -ld file 的執行結果。
-
>>> output=commands.getoutput("date")
-
>>> print output
-
Sun Sep 13 22:37:44 CST 2015
-
>>> status=commands.getstatus("date")
-
>>> print status
-
ls: cannot access date: No such file or directory
-
>>> commands.getstatus('/bin/ls')
-
'-rwxr-xr-x 1 root root 111744 May 29 2014 /bin/ls'
-
>>> st=commands.getstatus('/bin/ls')
-
>>> print st
-
-rwxr-xr-x 1 root root 111744 May 29 2014 /bin/ls
-
>>> status,output=commands.getstatusoutput("ls yy")
-
>>> print status,output
- 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一個子程式,並執行一個外部的程式。詳細資料請參考 官方文件
-
>>> import subprocess
-
>>> subprocess.call(["ls", "-l"])
-
total 20
-
-rwxr-xr-x 1 qilong.yangql users 14 Dec 30 2014 a
-
-rw-r--r-- 1 qilong.yangql users 54 Sep 13 22:22 cont
-
-rwxr-xr-x 1 root root 19 Jun 1 11:01 d
-
-rw-r--r-- 1 root root 68 Jul 7 09:45 database
-
drwxr-xr-x 3 qilong.yangql users 4096 Jan 11 2015 dbscripts
-
0
-
>>> subprocess.call(["ls"])
-
a cont d database dbscripts
-
0
-
>>> Popen = subprocess.Popen(["date"])
-
>>> Sun Sep 13 22:57:08 CST 2015
- >>> Popen.pid
1 支援和子程式互動
2 支援命令結果輸出
3 可以使用kill() ,terminate() 來控制子程式退出
4 還有很多請參考官方文件。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26845409/viewspace-1812326/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python中執行系統命令常見的幾種方法Python
- nslookup命令的常見用法
- useradd 命令的常見用法
- 執行緒8--GCD常見用法執行緒GC
- Linux常見命令(系統命令)Linux
- Git SSH 命令常見用法Git
- Python-呼叫執行系統命令Python
- PHP新用法,PHP執行系統外部命令篇(轉)PHP
- Python 執行 Linux 作業系統命令PythonLinux作業系統
- C#基礎系列:多執行緒的常見用法詳解C#執行緒
- Linux命令列:cURL的十種常見用法Linux命令列
- RMAN中SET命令的常見用法的小結 (ZT)
- 如何使用Python執行系統命令?Python學習教程!Python
- python執行系統命令四種方法比較Python
- shell入門基礎&常見命令及用法
- Python模組以及日曆常見用法Python
- 新手常見的Python執行時的17個錯誤Python
- Java程式執行系統命令Java
- Linux系統上常見的檔案管理類命令Linux
- 常見Oracle HINT的用法Oracle
- echo命令在Unix中的作用以及其常見用法?
- Python常見工廠函式用法示例Python函式
- 多執行緒-多執行緒常見的面試題執行緒面試題
- java 執行作業系統命令Java作業系統
- Node.js執行系統命令Node.js
- Linux系統執行命令方法Linux
- 常見的四種執行緒池執行緒
- Linux系統常見檔案大小常用的命令詳解!Linux
- AOSP常見的命令
- 常見的DOS命令
- 常見的錯誤 SQL 用法SQL
- urllib庫的常見用法
- 幾個常見函式的非常見用法函式
- 常見的 Linux 系統版本Linux
- 多執行緒中的鎖系統(一)-基礎用法執行緒
- 理解常見的執行緒同步設施執行緒
- python基礎之使用os.system來執行系統命令Python
- 命令列中常見命令用法及explainshell.com的用法命令列AI