search"exec"的相關介紹,但是沒太搞" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

舉例講解Linux系統下Python調用系統Shell的方法

系統 1754 0

時候難免需要直接調用Shell命令來完成一些比較簡單的操作,比如mount一個文件系統之類的。那么我們使用Python如何調用Linux的Shell命令?下面來介紹幾種常用的方法:
1. os 模塊

1.1. os模塊的exec方法族
Python的exec系統方法同Unix的exec系統調用是一致的。這些方法適用于在子進程中調用外部程序的情況,因為外部程序會替換當前進程的代碼,不會返回。( 這個看了點 help(os)? --> search "exec" 的相關介紹,但是沒太搞明白咋使用)


1.2. os模塊的system方法
system方法會創建子進程運行外部程序,方法只返回外部程序的運行結果。這個方法比較適用于外部程序沒有輸出結果的情況。

            
>>> import os 
>>> os.system("echo \"Hello World\"")  # 直接使用os.system調用一個echo命令 
Hello World     ――――――> 打印命令結果 
0          ――――――> What's this ? 返回值? 
>>> 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         ――――――> 使用os.system調用一個沒有返回結果的命令,返回值為256~ 
>>>  

          

注意:上面說了,此方法脂肪會外部程序的結果,也就是os.system的結果,所以如果你想接收命令的返回值,接著向下看~

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 
>>> val = os.popen('ls -lt').read()   # 使用變量可以接收命令返回值 
>>> if "log" in val:          # 我們可以使用in來判斷返回值中有木有一個字符串 
...   print "Haha,there is the log" 
... else: 
...   print "No,not happy" 
... 
Haha,there is the log 

            
          

2. commands 模塊

使用commands模塊的getoutput方法,這種方法同popend的區別在于popen返回的是一個類文件對象,而本方法將外部程序的輸出結果當作字符串返回,很多情況下用起來要更方便些。
主要方法:?
*?? commands.getstatusoutput(cmd)???????? 返回(status, output)
*?? commands.getoutput(cmd)?????????????????? 只返回輸出結果
*?? commands.getstatus(file)???????????????????? 返回ls -ld file的執行結果字符串,調用了getoutput,不建議使用此方法

            
long@zhouyl:/tmp/tests$ python 
Python 2.7.3 (default, Jan 2 2013, 16:53:07)  
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 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' 
>>>  

          

3. subprocess模塊

根據Python官方文檔說明,subprocess模塊用于取代上面這些模塊。有一個用Python實現的并行ssh工具―mssh,代碼很簡短,不過很有意思,它在線程中調用subprocess啟動子進程來干活。
>>> from subprocess import call?
>>> call(["ls", "-l"])?

subprocess與system相比的優勢是它更靈活(你可以得到標準輸出,標準錯誤,“真正”的狀態代碼,更好的錯誤處理,等..)。我認為使用os.system已過時,或即將過時。

4. 眾方法的比較以及總結
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會返回一個類文件對象,使用它來訪問標準輸入、輸出。
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類并都使用相同的參數,但是它只簡單的等待命令完成并給你返回代碼。比如:

            
return_code = subprocess.call("echo Hello World", shell=True)

          


os模塊中還有C中那樣的fork/exec/spawn函數,但是我不建議直接使用它們。subprocess可能更加適合你。

python和shell讀取文件某一行

python和shell(awk命令) 可以實現直接讀取文件的某一行,按行號進行讀取 。并可以精準的取得該行的某個字段,這個有點類似于x軸、y軸定位某個點的操作。

一、awk取某行某列值

awk 可以設置條件來輸出文件中m行到n行中每行的指定的k字段,使用格式如下:

            
awk  'NR==m,NR==n {print $k}' path/filename

          

m,n,k表示實在的數值。如果要用變量來表示m,n的值,則變量需要用單引號將其引起來。NR,{print }是awk命令在此用法下的規定字段;path/filename表示讀取文件的路徑及文件名。這里指定了兩行,如果只指定一行,可以這樣寫:

            
awk  'NR==m {print $k}' path/filename

          

二、python取某行某列

標準庫提供的linecache模塊提供具體取某一行的方法:

            
import linecache
theline = linecache.getline(filepath, line_number)

          

取到相關的行以后,再對theline做split切分成list,再對list索引取值就行了。如theline.split()[2] 。

三、linecache模塊的用法

即然,提到了linecache模塊,這里就列下linecache的其他方法。linecache模塊允許從任何文件里得到任何的行,并且使用緩存進行優化,常見的情況是從單個文件讀取多行。

linecache.getlines(filename) 從名為filename的文件中得到全部內容,輸出為列表格式,以文件每行為列表中的一個元素,并以linenum-1為元素在列表中的位置存儲
linecache.getline(filename,lineno) 從名為filename的文件中得到第lineno行。這個函數從不會拋出一個異常?C產生錯誤時它將返回”(換行符將包含在找到的行里)。如果文件沒有找到,這個函數將會在sys.path搜索。
linecache.clearcache() 清除緩存。如果你不再需要先前從getline()中得到的行
linecache.checkcache(filename) 檢查緩存的有效性。如果在緩存中的文件在硬盤上發生了變化,并且你需要更新版本,使用這個函數。如果省略filename,將檢查緩存里的所有條目。
linecache.updatecache(filename) 更新文件名為filename的緩存。如果filename文件更新了,使用這個函數可以更新linecache.getlines(filename)返回的列表。
示例:

            
# cat a.txt

          
            
1a
2b
3c
4d
5e
6f
7g

          

1、獲取a.txt文件的內容

            
>>> a=linecache.getlines('a.txt')
>>> a
['1a\n', '2b\n', '3c\n', '4d\n', '5e\n', '6f\n', '7g\n']

          

2、獲取a.txt文件中第1-4行的內容

            
>>> a=linecache.getlines('a.txt')[0:4]
>>> a
['1a\n', '2b\n', '3c\n', '4d\n']

          

3、獲取a.txt文件中第4行的內容

            
>>> a=linecache.getline('a.txt',4)
>>> a
'4d\n'

          

注意:

使用linecache.getlines('a.txt')打開文件的內容之后,如果a.txt文件發生了改變,如你再次用linecache.getlines獲取的內容,不是文件的最新內容,還是之前的內容,此時有兩種方法:

1、使用linecache.checkcache(filename)來更新文件在硬盤上的緩存,然后在執行linecache.getlines('a.txt')就可以獲取到a.txt的最新內容;

2、直接使用linecache.updatecache('a.txt'),即可獲取最新的a.txt的最新內容。

讀取文件之后你不需要使用文件的緩存時需要在最后清理一下緩存,使linecache.clearcache()清理緩存,釋放緩存。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲日韩中文字幕一区 | 亚洲欧美日韩中文字幕在线不卡 | 99这里只有精品6 | 亚洲视频天堂 | 久久久精品中文字幕 | 奇米影视色 | 天天人人精品 | 李飞| 欧美二级毛片免费高清电影 | 美美女高清毛片视频免费观看 | 日韩精品久久 | 4hu四虎永久免在线视看 | 天天射日日操 | 一级毛片免费播放 | 中文线码中文高清播放中 | 边摸边吃奶边做激情叫床 | 亚洲欧美国产视频 | 一级毛片免费 | 国产精品久久 | 二级黄绝大片中国免费视频 | 国产精品永久免费 | 成人国产欧美精品一区二区 | 日日干天天摸 | 国产成人一区二区 | 奇米奇米777 | 天天色天天色 | 久久99国产精品 | 欧美综合伊人久久 | 青娱乐精品在线 | 亚洲成人在线视频播放 | 国产在线永久免费 | 亚洲国产精品久久久久网站 | 色125综合网 | 欧美日韩一区二区三区高清不卡 | 午夜小视频网站 | 成人亚洲一区二区色情无码潘金莲 | 亚洲一区二区中文字幕 | 亚洲码欧美码一区二区三区 | 人人爱天天做夜夜爽 | 亚洲性色视频 | 成人一区二区三区 |