os 系統(tǒng)服務(wù)應(yīng)用程序接口(API),系統(tǒng)管理員最應(yīng)關(guān)注的模塊之一。 一、os模塊 (一)文件目錄,權(quán)限相關(guān) 1、創(chuàng)建目錄 mkdir(path [, mode=0777]) os.mkdir('/tmp/os_dir',0754) 2、刪除目錄 os.rmdir("/tmp/os_dir") 3、列出目錄內(nèi)容 os.listdir('/root') 結(jié)果為一個列表 4、更改文件目錄 os.chdir('/tmp') os.chroot('/tmp') #設(shè)置監(jiān)牢目錄 5、顯示當(dāng)前目錄 os.getcwd() '/tmp' 6、創(chuàng)建多層目錄 類似系統(tǒng)makedir -p os.makedirs('test/test1/test2') 7、刪除多層目錄【每層都是空的除了要刪除目錄外】 os.removedirs('/tmp/test/test1/test2') 8、創(chuàng)建一個文件 >>> f=open("/tmp/testfile", "w") >>> f.write('test\n') >>> f.close() 創(chuàng)建空文件呢? >>> f=open("/tmp/testfile", "w") >>> f.close() 9、刪除文件 os.remove("/tmp/testfile") 10、查看文件狀態(tài) os.stat('/tmp/os_dir') posix.stat_result(st_mode=16876, st_ino=17024L, st_dev=94L, st_nlink=2, st_uid=0, st_gid=0, st_size=512L, st_atime=1331646103, st_mtime=1331646103, st_ctime=1331646103) 依次是st_mode (權(quán)限模式), st_ino (inode number), st_dev (device), st_nlink (number of hard links), st_uid (所有者用戶 ID), st_gid (所有者所在組 ID ), st_size (文件大小, 字節(jié)), st_atime (最近一次訪問時間), st_mtime (最近修改時間), st_ctime (平臺相關(guān); Unix下的最近一次元數(shù)據(jù)/metadata修改時間, 或者 Windows 下的創(chuàng)建時間) - 以上項目也可作為屬性訪問 11、文件改名 文件夾改名 os.rename('/tmp/os_dir','/tmp/os_rename') 文件改名 os.rename('/tmp/testfile','/tmp/TSFILE') 12、文件權(quán)限修改 chmod(path, mode) os.chmod('/tmp/os_rename',0777) os.chmod('/tmp/TSFILE',0666) os.lchmod(path, mode) 修改連接文件權(quán)限 13、文件屬主修改 chown(path, uid, gid) os.chown('/tmp/TSFILE',1003,1003) os.chown('os_rename',0,1003) 14、umask os.umask(022) 15、os.walk(topdirpath, topdown=True, onerror=None, followlinks=False) os.walk() 函數(shù)聲明:walk(top,topdown=True,onerror=None) 1>參數(shù)top表示需要遍歷的目錄樹的路徑 2>參數(shù)topdown的默認值是"True",表示首先返回目錄樹下的文件,然后在遍歷目錄樹的子目錄.Topdow n的值為"False"時,則表示先遍歷目錄樹的子目錄,返回子目錄下的文件,最后返回根目錄下的文件 3>參數(shù)onerror的默認值是"None",表示忽略文件遍歷時產(chǎn)生的錯誤.如果不為空,則提供一個自定義函 數(shù)提示錯誤信息后繼續(xù)遍歷或拋出異常中止遍歷 4>該函數(shù)返回一個元組,該元組有3個元素,這3個元素分別表示每次遍歷的路徑名,目錄列表和文件 列表 dirpath, dirnames, filenames 對于每個目錄樹中的目錄根在頂部(包括頂部本身,但不包括.和..),產(chǎn)生一個3元組 組成的元組對象(dirpath,dirnames,文件名) 第一元素就是頂層目錄,也就是walk方法的第一個參數(shù) 第二元素是頂層目錄下子目錄的列表 第三個元素為該目錄的文件組成的列表 dirroot.next() 第一次是查找的目錄為頂層目錄 第二次迭代就是頂層目錄下其他字目錄,然后依次就可以獲取所有目錄下面的文件 為了得到一個完整的路徑(頂部開始)到一個文件或目錄dirpath,做os.path.join(dirpath,filename)。 默認情況下,os.walk不遵循符號鏈接到子目錄支持它們的系統(tǒng)。為了得到這個功能,設(shè)置可選參數(shù)'followlinks為true 將根目錄和文件名連接在一起【包括目錄和子目錄都join】 for root,dir,file in os.walk('/root'): [os.path.join(root,name) for name in file] 這個結(jié)果是每個文件和每個文件夾都是一個列表 ... for root,dir,file in os.walk('/root'): for filename in file: os.path.join(root,filename) 這個結(jié)果顯示每一個文件的路徑(包括隱藏文件) .... >>> path_collection=[] >>> for root,dir,file in os.walk('/root'): ... for filename in file: ... fullpath=os.path.join(root,filename) ... path_collection.append(fullpath) 將目錄全部文件的路徑,保存到一個列表對象 .......... 將根目錄和子目錄連接在一起 for root, dirs, files in os.walk('/root'): [os.path.join(root,dirname) for dirname in dirs] >>> for root, dirs, files in os.walk('/root'): ... print root, "consumes", ... print sum([getsize(join(root, name)) for name in files]), ... print "bytes in", len(files), "non-directory files" 每一個目錄都是root (二)用戶相關(guān) os.getuid() os.getgid() os.getgroups() os.getlogin() 登陸用戶 (二)進程相關(guān) 1、獲取當(dāng)前進程 os.getpid 2、執(zhí)行操作系統(tǒng)命名 1)os.system(command) 這個方法直接返回命令的結(jié)果 command = "ls -l" os.system(command) os.system('ps -aux|grep python') 2)os.popen(command) 這個方法將命令返回值得保存到一個文件對象里,這個對象需要通過read()等方法讀取內(nèi)容。 Open a pipe to/from a command returning a file object. 這個文件對象保留在內(nèi)存中。 p=os.popen('ssh 10.3.16.121 ps aux | grep mysql') x=p.read() print x p.close() print os.popen('ps aux | grep python').read() 如果不確定參數(shù)的安全性, 那么最好使用 exec 或 spawn 3、啟動新的進程 >>> import os >>> program = "python" >>> arguments = ["hello.py"] >>> os.execvp(program, (program,) + tuple(arguments)) hello again, and welcome to the show 使用的是execvp函數(shù),它會從【標(biāo)準(zhǔn)路徑搜索執(zhí)行程序】,把第二個參數(shù)(元組)作為單獨的參數(shù)傳遞給程 序,并使用當(dāng)前的環(huán)境變量來運行程序. 其他七個同類型函數(shù)。 在 Unix 環(huán)境下, 你可以通過組合使用 exec , fork 以及 wait 函數(shù)來從當(dāng)前程序調(diào)用另一個程序, fork 函數(shù)復(fù)制當(dāng)前進程, wait 函數(shù)會等待一個子進程執(zhí)行結(jié)束. 3、os 模塊調(diào)用其他程序 (Unix) >>> def run(program, *args): ... pid = os.fork() ... if not pid: ... os.execvp(program, (program,) + args) ... return os.wait()[0] >>> run("python", "hello.py") hello again, and welcome to the show 1701 fork函數(shù)在子進程中返回0(這個進程首先從fork返回值),在父進程中返回一個非0的進程標(biāo)識符(子進程的PID). 也就是說, 只有當(dāng)我們處于父進程的時候 "not pid" 才為真.(即在子進程中pid為0,pid==0為真,在父進程中not pid(not 0),pid>0為真) 通過os模塊中的fork方法,一個進程(Process)可以生成一個獨立子進程。fork是一個程序拷貝(copyi ng-program)的過程:當(dāng)程序調(diào)用fork方法,操作系統(tǒng)生成一份該程序及其在內(nèi)存中的進程的新的拷貝 ,并以與原始程序并行的方式開始執(zhí)行這份拷貝。原始程序稱為父進程,新生成的拷貝叫做子進程。父 進程可以生成任意數(shù)目的子進程,子進程還可以生成它的子進程。這些子進程在操作系統(tǒng)的控制下相互獨立的并行運行。子進程可以繼續(xù)運行即便父進程已退出。 >>> def run(program, *args): ... pid = os.fork() ... if not pid: ... os.execvp(program, (program,) + args) ... return os.wait() ... >>> run("python", "hello.py") hello again, and welcome to the show (1546, 0) os.wait() 返回一個元組,這個兩個數(shù)據(jù)代表什么? 第一元組已完成的子進程號pid,第二個元素為0表示子進程的退出狀態(tài) os.wait函數(shù)用于等待子進程結(jié)束(只適用于UNIX兼容系統(tǒng))。該函數(shù)返回包含兩個元素的元組,包括已完成的子進程號pid。以及子進程的退出狀態(tài),返回狀態(tài)為0,表明子進程成功完成。返回狀態(tài)為正整數(shù)表明子進程終止時出錯. 如沒有子進程,會引發(fā)OSError錯誤。os.wait 要求父進程等待它的任何一個子進程結(jié)束執(zhí)行,然后喚醒父進程。要指示父進程等候一個指定的子進程終止,可在父進程中使用os.waitpid 函數(shù)(只適用于unix兼容系統(tǒng)). 它可等候一個指定進程結(jié)束,然后返回一個雙元素元組,其中包括子進程的pid和子進程的退出狀態(tài)。函數(shù)調(diào)用將pid 作為第一個參數(shù)傳遞。并將一個選項作為第二個選項,如果第一個參數(shù)大于0,則waitpid會等待該pid結(jié)束,如果第一個參數(shù)是-1 ,則會等候所有子進程,也就和os.wait一樣 參考http://developer.51cto.com/art/201003/185584.htm fork和wait 函數(shù)在 Windows 上是不可用的, 但是你可以使用 spawn 函數(shù), 不過, spawn 不會沿著路徑搜索可執(zhí)行文件, 你必須自己處理好這些 4、使用 os 模塊調(diào)用其他程序 (Windows) os.spawnv(os.P_WAIT, file, (file,) + args) 5、使用 spawn 或 fork/exec 調(diào)用其他程序 6、處理守護進程(Daemon Processes) Unix系統(tǒng)中,你可以使用fork函數(shù)把當(dāng)前進程轉(zhuǎn)入后臺(一個"守護者/daemon").一般來說,需要派生(fo rk off)一個當(dāng)前進程的副本, 然后終止原進程 import os import time pid = os.fork() if pid: os._exit(0) # kill original print "daemon started" time.sleep(10) print "daemon terminated" 7、使用os模塊終止當(dāng)前進程 os._exit(0) (三)執(zhí)行操作系統(tǒng)命名 command = "ls -l" os.system(command) os.system('ps -aux|grep python') (四)其他 1、獲取環(huán)境變量 os.getenv('USER',default=None) os.getenv('HOSTTYPE',default=None) 2、修改環(huán)境 putenv(key, value) 3、判斷操作系統(tǒng) os.name if os.name in ("nt", "dos"): exefile = ".exe" else: exefile = " (五)os.path模塊 os.path模塊包含了各種處理長文件名(路徑名)的函數(shù).先導(dǎo)入os模塊,然后就可以以os.path訪問該模 塊 1)簡單的方法 拆分,目錄名,文件名,連接 import os filename = "my/little/pony" print "using", os.name, "..." print "split", "=>", os.path.split(filename) print "splitext", "=>", os.path.splitext(filename) print "dirname", "=>", os.path.dirname(filename) print "basename", "=>", os.path.basename(filename) print "join", "=>", os.path.join(os.path.dirname(filename),os.path.basename(filename)) 結(jié)果 using posix ... split => ('my/little', 'pony') splitext => ('my/little/pony', '') dirname => my/little basename => pony join => my/little/pony 注意這里的 split 只分割出最后一項(不帶斜杠). 2、判斷文件或文件夾是否存在 >>> os.path.exists(filename) False >>> os.path.exists('/root') True >>> os.path.exists('/root/wc.py') True 3、判斷是否是目錄 >>> os.path.isdir('/root/wc.py') False >>> os.path.isdir('/root') True 4、判斷是否是文件 >>> os.path.isfile('/root') False >>> os.path.isfile('/root/wc.py') True 5、判斷是否是連接文件,是否是掛載文件 >>> os.path.islink('/root/wc.py') >>> os.path.ismount('/root/wc.py') 6、判斷兩個目錄是否有相同的文件 >>> os.path.samefile('/root/pathdir1','/root/pathdir2') True 做了鏈接,判斷就為真。 7、獲取文件(文件夾)大小 >>> os.path.getsize('/root/pathdir1') 512L 8、獲取文件時間戳 創(chuàng)建時間 >>> os.path.getctime('/root/pathdir1/person.py') 修改時間 >>> os.path.getmtime('/root/pathdir1/person.py') 訪問時間 >>> os.path.getatime('/root/pathdir1/person.py') 9、walk(top, func, arg) Directory tree walk with callback function. os.path.walk() 函數(shù)聲明:walk(top,func,arg) 1>參數(shù)top表示需要遍歷的目錄樹的路徑 2>參數(shù)func表示回調(diào)函數(shù),對遍歷路徑進行處理.所謂回調(diào)函數(shù),是作為某個函數(shù)的參數(shù)使用,當(dāng)某個 時間觸發(fā)時,程序?qū)⒄{(diào)用定義好的回調(diào)函數(shù)處理某個任務(wù).回調(diào)函數(shù)必須提供3個參數(shù):第1個參數(shù)為wa lk()的參數(shù)arg,第2個參數(shù)表示目錄列表,第3個參數(shù)表示文件列表 3>參數(shù)arg是傳遞給回調(diào)參數(shù)func的元組.回調(diào)函數(shù)的一個參數(shù)必須是arg,為回調(diào)函數(shù)提供處理參數(shù). 參數(shù)arg可以為空 import os def callback(arg, directory, files): for file in files: print os.path.join(directory, file), repr(arg) os.path.walk("/root", callback, "secret message" os.path.walk的第三個參數(shù)傳給回調(diào)函數(shù)做第一參數(shù),os.path.walk的第一個參數(shù)(目錄)傳遞給回 調(diào)函數(shù)做第二個函數(shù),回調(diào)函數(shù)的第三個函數(shù)就是目錄下的file. os.path.walk()與os.walk()產(chǎn)生的文件名列表并不相同.os.path.walk()產(chǎn)生目錄樹下的目錄路徑和\ 文件路徑,而os.walk()只產(chǎn)生文件路徑. # -*- coding: utf-8 -*- import os for root, dirs, files in os.walk('/root'): open('/tmp/rootdir', 'a').write("%s %s %s" % (root,dirs,files)) |
|