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é)果為一個(gè)列表 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、刪除多層目錄【每層都是空的除了要?jiǎng)h除目錄外】 os.removedirs('/tmp/test/test1/test2') 8,、創(chuàng)建一個(gè)文件 >>> 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 (最近一次訪問時(shí)間), st_mtime (最近修改時(shí)間), st_ctime (平臺相關(guān); Unix下的最近一次元數(shù)據(jù)/metadata修改時(shí)間, 或者 Windows 下的創(chuàng)建時(shí)間) - 以上項(xià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的默認(rèn)值是"True",表示首先返回目錄樹下的文件,然后在遍歷目錄樹的子目錄.Topdow n的值為"False"時(shí),,則表示先遍歷目錄樹的子目錄,,返回子目錄下的文件,最后返回根目錄下的文件 3>參數(shù)onerror的默認(rèn)值是"None",表示忽略文件遍歷時(shí)產(chǎn)生的錯(cuò)誤.如果不為空,,則提供一個(gè)自定義函 數(shù)提示錯(cuò)誤信息后繼續(xù)遍歷或拋出異常中止遍歷 4>該函數(shù)返回一個(gè)元組,該元組有3個(gè)元素,,這3個(gè)元素分別表示每次遍歷的路徑名,,目錄列表和文件 列表 dirpath, dirnames, filenames 對于每個(gè)目錄樹中的目錄根在頂部(包括頂部本身,但不包括.和..),,產(chǎn)生一個(gè)3元組 組成的元組對象(dirpath,,dirnames,文件名) 第一元素就是頂層目錄,,也就是walk方法的第一個(gè)參數(shù) 第二元素是頂層目錄下子目錄的列表 第三個(gè)元素為該目錄的文件組成的列表 dirroot.next() 第一次是查找的目錄為頂層目錄 第二次迭代就是頂層目錄下其他字目錄,,然后依次就可以獲取所有目錄下面的文件 為了得到一個(gè)完整的路徑(頂部開始)到一個(gè)文件或目錄dirpath,做os.path.join(dirpath,filename),。 默認(rèn)情況下,,os.walk不遵循符號鏈接到子目錄支持它們的系統(tǒng)。為了得到這個(gè)功能,,設(shè)置可選參數(shù)'followlinks為true 將根目錄和文件名連接在一起【包括目錄和子目錄都join】 for root,dir,file in os.walk('/root'): [os.path.join(root,name) for name in file] 這個(gè)結(jié)果是每個(gè)文件和每個(gè)文件夾都是一個(gè)列表 ... for root,dir,file in os.walk('/root'): for filename in file: os.path.join(root,filename) 這個(gè)結(jié)果顯示每一個(gè)文件的路徑(包括隱藏文件) .... >>> path_collection=[] >>> for root,dir,file in os.walk('/root'): ... for filename in file: ... fullpath=os.path.join(root,filename) ... path_collection.append(fullpath) 將目錄全部文件的路徑,,保存到一個(gè)列表對象 .......... 將根目錄和子目錄連接在一起 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" 每一個(gè)目錄都是root (二)用戶相關(guān) os.getuid() os.getgid() os.getgroups() os.getlogin() 登陸用戶 (二)進(jìn)程相關(guān) 1、獲取當(dāng)前進(jìn)程 os.getpid 2,、執(zhí)行操作系統(tǒng)命名 1)os.system(command) 這個(gè)方法直接返回命令的結(jié)果 command = "ls -l" os.system(command) os.system('ps -aux|grep python') 2)os.popen(command) 這個(gè)方法將命令返回值得保存到一個(gè)文件對象里,,這個(gè)對象需要通過read()等方法讀取內(nèi)容。 Open a pipe to/from a command returning a file object. 這個(gè)文件對象保留在內(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,、啟動(dòng)新的進(jìn)程 >>> 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í)行程序】,把第二個(gè)參數(shù)(元組)作為單獨(dú)的參數(shù)傳遞給程 序,并使用當(dāng)前的環(huán)境變量來運(yùn)行程序. 其他七個(gè)同類型函數(shù)。 在 Unix 環(huán)境下, 你可以通過組合使用 exec , fork 以及 wait 函數(shù)來從當(dāng)前程序調(diào)用另一個(gè)程序, fork 函數(shù)復(fù)制當(dāng)前進(jìn)程, wait 函數(shù)會等待一個(gè)子進(jìn)程執(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ù)在子進(jìn)程中返回0(這個(gè)進(jìn)程首先從fork返回值),在父進(jìn)程中返回一個(gè)非0的進(jìn)程標(biāo)識符(子進(jìn)程的PID). 也就是說, 只有當(dāng)我們處于父進(jìn)程的時(shí)候 "not pid" 才為真.(即在子進(jìn)程中pid為0,,pid==0為真,在父進(jìn)程中not pid(not 0),pid>0為真) 通過os模塊中的fork方法,,一個(gè)進(jìn)程(Process)可以生成一個(gè)獨(dú)立子進(jìn)程,。fork是一個(gè)程序拷貝(copyi ng-program)的過程:當(dāng)程序調(diào)用fork方法,操作系統(tǒng)生成一份該程序及其在內(nèi)存中的進(jìn)程的新的拷貝 ,,并以與原始程序并行的方式開始執(zhí)行這份拷貝,。原始程序稱為父進(jìn)程,新生成的拷貝叫做子進(jìn)程。父 進(jìn)程可以生成任意數(shù)目的子進(jìn)程,,子進(jìn)程還可以生成它的子進(jìn)程,。這些子進(jìn)程在操作系統(tǒng)的控制下相互獨(dú)立的并行運(yùn)行。子進(jìn)程可以繼續(xù)運(yùn)行即便父進(jìn)程已退出,。 >>> 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() 返回一個(gè)元組,,這個(gè)兩個(gè)數(shù)據(jù)代表什么? 第一元組已完成的子進(jìn)程號pid,,第二個(gè)元素為0表示子進(jìn)程的退出狀態(tài) os.wait函數(shù)用于等待子進(jìn)程結(jié)束(只適用于UNIX兼容系統(tǒng)),。該函數(shù)返回包含兩個(gè)元素的元組,包括已完成的子進(jìn)程號pid,。以及子進(jìn)程的退出狀態(tài),,返回狀態(tài)為0,表明子進(jìn)程成功完成,。返回狀態(tài)為正整數(shù)表明子進(jìn)程終止時(shí)出錯(cuò). 如沒有子進(jìn)程,,會引發(fā)OSError錯(cuò)誤。os.wait 要求父進(jìn)程等待它的任何一個(gè)子進(jìn)程結(jié)束執(zhí)行,,然后喚醒父進(jìn)程,。要指示父進(jìn)程等候一個(gè)指定的子進(jìn)程終止,可在父進(jìn)程中使用os.waitpid 函數(shù)(只適用于unix兼容系統(tǒng)). 它可等候一個(gè)指定進(jìn)程結(jié)束,,然后返回一個(gè)雙元素元組,,其中包括子進(jìn)程的pid和子進(jìn)程的退出狀態(tài)。函數(shù)調(diào)用將pid 作為第一個(gè)參數(shù)傳遞,。并將一個(gè)選項(xiàng)作為第二個(gè)選項(xiàng),,如果第一個(gè)參數(shù)大于0,則waitpid會等待該pid結(jié)束,,如果第一個(gè)參數(shù)是-1 ,,則會等候所有子進(jìn)程,也就和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、處理守護(hù)進(jìn)程(Daemon Processes) Unix系統(tǒng)中,你可以使用fork函數(shù)把當(dāng)前進(jìn)程轉(zhuǎn)入后臺(一個(gè)"守護(hù)者/daemon").一般來說,需要派生(fo rk off)一個(gè)當(dāng)前進(jìn)程的副本, 然后終止原進(jìn)程 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)前進(jìn)程 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 只分割出最后一項(xiàng)(不帶斜杠). 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、判斷兩個(gè)目錄是否有相同的文件 >>> os.path.samefile('/root/pathdir1','/root/pathdir2') True 做了鏈接,,判斷就為真,。 7、獲取文件(文件夾)大小 >>> os.path.getsize('/root/pathdir1') 512L 8,、獲取文件時(shí)間戳 創(chuàng)建時(shí)間 >>> os.path.getctime('/root/pathdir1/person.py') 修改時(shí)間 >>> os.path.getmtime('/root/pathdir1/person.py') 訪問時(shí)間 >>> 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ù),對遍歷路徑進(jìn)行處理.所謂回調(diào)函數(shù),,是作為某個(gè)函數(shù)的參數(shù)使用,,當(dāng)某個(gè) 時(shí)間觸發(fā)時(shí),程序?qū)⒄{(diào)用定義好的回調(diào)函數(shù)處理某個(gè)任務(wù).回調(diào)函數(shù)必須提供3個(gè)參數(shù):第1個(gè)參數(shù)為wa lk()的參數(shù)arg,,第2個(gè)參數(shù)表示目錄列表,第3個(gè)參數(shù)表示文件列表 3>參數(shù)arg是傳遞給回調(diào)參數(shù)func的元組.回調(diào)函數(shù)的一個(gè)參數(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的第三個(gè)參數(shù)傳給回調(diào)函數(shù)做第一參數(shù),,os.path.walk的第一個(gè)參數(shù)(目錄)傳遞給回 調(diào)函數(shù)做第二個(gè)函數(shù),回調(diào)函數(shù)的第三個(gè)函數(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)) |
|