(1) os.system
僅僅在一個子終端運行系統命令,而不能獲取命令執行后的返回信息
代碼如下:
system(command) -> exit_status
Execute the command (a string) in a subshell.
如果在命令行下執行,結果直接打印出來
代碼如下:
>>> os.system('ls')
04101419778.CHM bash document media py-django video
11.wmv books downloads Pictures
python
all-20061022 Desktop Examples project tools
(2) os.popen
該方法不但執行命令還返回執行后的信息對象
代碼如下:
popen(command [, mode='r' [, bufsize]]) -> pipe
Open a pipe to/from a command returning a file object.
例如:
代碼如下:
>>> tmp = os.popen('ls *.py').readlines()
>>> tmp
Out[21]: ['dump_db_pickle.py ',
'dump_db_pickle_recs.py ',
'dump_db_shelve.py ',
'initdata.py ', '__init__.py ',
'make_db_pickle.py ',
'make_db_pickle_recs.py ',
'make_db_shelve.py ',
'peopleinteract_query.py ',
'reader.py ', 'testargv.py ',
'teststreams.py ',
'update_db_pickle.py ',
'writer.py ']
好處在於:將返回的結果賦於一變量,便於程序的處理。
(3) 使用模塊 subprocess
代碼如下:
>>> import subprocess
>>> subprocess.call(["cmd", "arg1", "arg2"],shell=True)
獲取返回和輸出:
代碼如下:
import subprocess
p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
print line,
retval = p.wait()
(4) 使用模塊 commands
代碼如下:
>>> import commands
>>> dir(commands) ['__all__', '__builtins__', '__doc__', '__file__', '__name__', 'getoutput', 'getstatus','getstatusoutput', 'mk2arg', 'mkarg']
>>> commands.getoutput("date") 'Wed Jun 10 19:39:57 CST 2009'
>>>
>>> commands.getstatusoutput("date")
(0, 'Wed Jun 10 19:40:41 CST 2009')
注意: 當執行命令的參數或者返回中包含了中文文字,那么建議使用subprocess,如果使用os.popen則會出現下面的錯誤:
代碼如下:
Traceback (most recent call last):
File "./test1.py", line 56, inmain()
File "./test1.py", line 45, in main
fax.sendFax()
File "./mailfax/Fax.py", line 13, in sendFax
os.popen(cmd)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-52: ordinal not inrange(128)
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.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()剛好相反。
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])
這個函數可以調用 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.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()剛好相反。
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])
