python中的shell操作

2021-05-27 09:57:27 字數 4770 閱讀 1698

首先介紹乙個函式:

os.system(command)

這個函式可以呼叫shell執行命令列command並且返回它的返回值。試一下在python的直譯器裡輸入os.system(」ls-l」),就可以看到」ls」列出了當前目錄下的檔案。可以說,通過這個函式,python就擁有了shell的所有能力。呵呵。。不過,通常這條命令不需要用到。因為shell常用的那些命令在python中通常有對應而且同樣簡潔的寫法。

shell中最常用的是ls命令,python對應的寫法是:os.listdir(dirname),這個函式返回字串列表,裡面是所有的檔名,不過不包含」.」和」..」。如果要遍歷整個目錄的話就會比較複雜一點。我們等下再說吧。先在直譯器裡試一下:

>>> os.listdir(」/」)

[』tmp』, 『misc』, 『opt』, 『root』, 『.autorelabel』, 』sbin』, 』srv』,『.autofsck』, 『mnt』, 『usr』, 『var』, 『etc』, 』selinux』, 『lib』, 『net』,『lost+found』, 』sys』, 『media』, 『dev』, 『proc』, 『boot』, 『home』, 『bin』]

就像這樣,接下去所有命令都可以在python的直譯器裡直接執行**結果。

對應於cp命令的是:shutil.copy(src,dest),這個函式有兩個引數,引數src是指原始檔的名字,引數dest則是目標檔案或者目標目錄的名字。 如果dest是乙個目錄名,就會在那個目錄下建立乙個相同名字的檔案。與shutil.copy函式相類似的是shutil.copy2(src,dest),不過copy2還會複製最後訪問時間和最後更新時間。

不過,shell的cp命令還可以複製目錄,python的shutil.copy卻不行,第乙個引數只能是乙個檔案。這怎麼辦?其實,python還有個shutil.copytree(src,dst[,symlinks])。引數多了乙個symlinks,它是乙個布林值,如果是true的話就建立符號鏈結。

移動或者重新命名檔案和目錄呢?估計被聰明的朋友猜到了,shutil.move(src,dst),呵呵。。與mv命令類似,如果src和dst在同乙個檔案系統上,shutil.move只是簡單改一下名字,如果src和dst在不同的檔案系統上,shutil.move會先把src複製到dst,然後刪除src檔案。看到現在,大多數朋友應該已經對python的能力有點眉目了,接下來我就列個表,介紹一下其它的函式:

os.chdir(dirname)

把當前工作目錄切換到dirname下

os.getcwd()

返回當前的工作目錄路徑

os.chroot(dirname)

把dirname作為程序的根目錄。和*nix下的chroot命令類似

os.chmod(path,mode)

更改path的許可權位。mode可以是以下值(使用or)的組合:

os.s_isuid

os.s_isgid

os.s_enfmt

os.s_isvtx

os.s_iread

os.s_iwrite

os.s_iexec

os.s_irwxu

os.s_irusr

os.s_iwusr

os.s_ixusr

os.s_irwxg

os.s_irgrp

os.s_iwgrp

os.s_ixgrp

os.s_irwxo

os.s_iroth

os.s_iwoth

os.s_ixoth

具體它們是什麼含義,就不仔細說了,基本上就是r代表讀,w代表寫,x代表執行許可權。usr代表使用者,grp代表組,oth代表其它。

os.chown(path,uid,gid)

改變檔案的屬主。uid和gid為-1的時候不改變原來的屬主。

os.link(src,dst)

建立硬連線

os.mkdir(path,[mode])

建立目錄。mode的意義參見os.chmod(),預設是0777

os.makedirs(path,[mode])

和os.mkdir()類似,不過會先建立不存在的父目錄。

os.readlink(path)

返回path這個符號鏈結所指向的路徑

os.remove(path)

刪除檔案,不能用於刪除目錄

os.rmdir(path)

刪除資料夾,不能用於刪除檔案

os.symlink(src,dst)

建立符號鏈結

shutil.rmtree(path[,ignore_errors[,onerror]])

刪除資料夾

介紹了這麼多,其實只要查一下os和shutil兩個模組的文件就有了,呵呵。。真正編寫shell指令碼的時候還需要注意:

1.環境變數。python的環境變數儲存在os.environ這個字典裡,可以用普通字典的方法修改它,使用system啟動其它程式的時候會自動被繼承。比如:

os.environ[」fish」]=」nothing」

不過也要注意,環境變數的值只能是字串。和shell有些不同的是,python沒有export環境變數這個概念。為什麼沒有呢?因為python沒有必要有:-)

2.os.path這個模組裡包含了很多關於路徑名處理的函式。在shell裡路徑名處理好像不是很重要,但是在python裡經常需要用到。最常用的兩個是分離和合併目錄名和檔名:

os.path.split(path) -> (dirname,basename)

這個函式會把乙個路徑分離為兩部分,比如:os.path.split(」/foo/bar.dat」)會返回(」/foo」,」bar.dat」)

os.path.join(dirname,basename)

這個函式會把目錄名和檔名組合成乙個完整的路徑名,比如:os.path.join(」/foo」,」bar.dat」)會返回」/foo /bar.dat」。這個函式和os.path.split()剛好相反。

還有這些函式:

os.path.abspath(path)

把path轉成絕對路徑

os.path.expanduser(path)

把path中包含的」~」和」~user」轉換成使用者目錄

os.path.expandvars(path)

根據環境變數的值替換path中包含的」$name」和」$」,比如環境變數fish=nothing,那 os.path.expandvars(」$fish/abc」)會返回」nothing/abc」

os.path.normpath(path)

去掉path中包含的」.」和」..」

os.path.splitext(path)

把path分離成基本名和副檔名。比如:os.path.splitext(」/foo/bar.tar.bz2″)返回(』/foo /bar.tar』, 『.bz2′)。要注意它和os.path.split()的區別

3.在os模組有乙個很好用的函式叫os.stat()沒有介紹,因為os.path模組裡包含了一組和它具有同樣功能的函式,但是名字更好記一點。

os.path.exists(path)

判斷檔案或者目錄是否存在

os.path.isfile(path)

判斷path所指向的是否是乙個普通檔案,而不是目錄

os.path.isdir(path)

判斷path所指向的是否是乙個目錄,而不是普通檔案

os.path.islink(path)

判斷path所指向的是否是乙個符號鏈結

os.path.ismount(path)

判斷path所指向的是否是乙個掛接點(mount point)

os.path.getatime(path)

返回path所指向的檔案或者目錄的最後訪問時間。

os.path.getmtime(path)

返回path所指向的檔案或者目錄的最後修改時間

os.path.getctime(path)

返回path所指向的檔案的建立時間

os.path.getsize(path)

返回path所指向的檔案的大小

4.應用python編寫shell指令碼經常要用到os,shutil,glob(正規表示式的檔名),tempfile(臨時檔案),pwd(操作/etc/passwd檔案),grp(操作/etc/group檔案),commands(取得乙個命令的輸出)。前面兩個已經基本上介紹完了,後面幾個很簡單,看一下文件就可以了。

5.sys.argv是乙個列表,儲存了python程式的命令列引數。其中sys.argv[0]是程式本身的名字。

不能光說不練,接下來我們就編寫乙個用於複製檔案的簡單指令碼。前兩天叫我寫指令碼的同事有個幾萬個檔案的目錄,他想複製這些檔案到其它的目錄,又不能直接複製目錄本身。他試了一下」cp src/* dest/」結果報了乙個命令列太長的錯誤,讓我幫他寫乙個指令碼。操起python來:

import sys,os.path,shutil

for f in os.listdir(sys.argv[1]):

shutil.copy(os.path.join(sys.argv[1],f),sys.argv[2])

import os.path,sys

dirname=sys.argv[1]

i=10001

for f in os.listdir(dirname):

src=os.path.join(dirname,f)

if os.path.isdir(src):

continue

os.rename(src,str(i))

i+=1

from:

HDFS中的shell操作

1.首先命令都是以hadoop fs 開頭 2.hadoop fs ls 檢視hdfs的根目錄下的內容,hadoop fs lsr 遞迴檢視根目錄下的內容 3.hadoop fs mkdir gao,在hdfs上建立資料夾gao 4.hadoop fs put 把資料從linux上傳到hdfs的特定...

shell中陣列的操作

在寫shell指令碼時,有時也希望像c語言那樣去使用陣列,bash是支援一維陣列的。本文主要介紹在shell指令碼中關於陣列的應用,包括陣列的定義 讀取 替換 刪除和複製。類似與c語言,陣列元素的下標由0開始編號。獲取陣列中的元素要利用下標,下標可以是整數或算術表示式,其值應大於或等於0。在shel...

Shell中陣列的操作

看一下shell中陣列的幾種操作 定義 遍歷 修改 刪除 引數傳遞操作 shell中對於陣列的定義直接使用 元素之間使用空格隔開即可 array 1 2 3 4 5 array abc def gh 取得陣列的值 取出所有的數值以及取出某個位置上的數值 echo echo echo array 0 ...