本文介绍Python编写系统管理脚本的相关知识,重点介绍os和sys模块。
Python的os模块提供putenv()/getenv()或者environ字典用于读取和设置环境变量。并不是所有的系统都支持 putenv()/getenv()方法,而environ字典则支持所有的系统,因此建议使用environ字典来设置系统环境。
>>> os.environ['CVSROOT'] = ':pserver:user@server:/share/cvsroot' >>> os.getenv('JAVA_HOME') '/usr/java/j2sdk1.4.2_04' >>> os.putenv('CVSROOT',':pserver:user@server:/share/cvsroot')
sys模块可以查询操作系统平台和版本信息,如下所示:
Python程序导入模块时,会搜索sys.path路径包含的目录,默认系统搜索路径如下所示:
>>> sys.path ['', '/usr/lib/python24.zip', '/usr/lib/python2.4', ...]
添加用户的搜索路径有两种方式:
用户的模块应该放在单独的目录,并添加这个目录到模块搜索路径中。例如,Windows系统可以放在C:\WINNT\pylibs目录中,Linux系统可以放在/usr/local/pylibs目录中,然后设置系统环境变量。
os.system()用来执行shell命令,执行结果显示在标准输出,如下所示:
>>> os.system('tail -n 1 /etc/hosts') 127.0.0.1 localhost.localdomain localhost 0
最后一行是返回值,命令执行成功返回值为零。可以通过判断返回值来处理命令执行不成功的情况,例如:
if (os.system('cat /etc/nonexistence') != 0): print "I can't continue" sys.exit(1)
os.system()os.popen()能将结果集保存到一个列表中,你可以对结果集进一步处理。例如:
cmd = 'find .' result = [] for line in os.popen(cmd).readlines(): result.append(line[:-1]) print result
结果集中还包括换行符,用 [:-1] 移去每一行中的换行符。
popen() 将运行结果保存在一个内存文件中,因此可以用读写普通文件的方式读取内存文件,例如:
cmd = '/usr/bin/mkpasswd' handler = os.popen(cmd,'r') passwordString=handler.read()
如果 popen() 执行命令成功执行,那么退出状态为0。调用 close() 方法关闭内存文件的返回值为 None,如果命令不是成功执行,退出状态非0,调用 close() 方法的返回值就是命令的返回值。因此可以通过判断 close() 返回值得到命令的返回值,例如:
cmd='/sbin/service mysqld stop' cmdHander=os.popen(cmd) for line in cmdHander.readlines(): print "LINE: " + line ex = cmdHander.close() if ex == None: print 0 else: print ex print os.system(cmd)
调用 os.popen() 可以和 os.system() 得到相同的返回值。
os.path 对象包括对路径处理的函数和属性。
os.path.sep 属性用于跨平台的程序表示路径分隔符,Windows 系统中为 '\',Unix/Linux 中为 '/',例如:
>>> os.path.sep '/'
os.path.split() 函数分隔出一个路径的目录名和文件名,例如:
>>> os.path.split('/home/swaroop/byte/code/poem.txt') ('/home/swaroop/byte/code', 'poem.txt')
另外,还可以分别得到目录名和文件名,例如:
>>> os.path.basename("/var/log/maillog") 'maillog' >>> os.path.dirname("/var/log/maillog") '/var/log'
Windows 路径用特殊字符 '\' 分隔,因此需要通过转移字符 '\\' 表示,例如:
os.path.isfile("C:\\WINNT\\hosts")
os.path.isdir无法正确判断类似 ~/work 之类的目录,一定要使用绝对路径: /home/daniel/work。
os 类中包括基本的目录操作,shutil 类能够执行高级的文件操作,包括复制文件和删除目录树。os 类主要包括以下函数:
mkdir(), makedirs() 可以创建目录或多层目录。
os.mkdir('testDir') os.makedirs('abc/efg/hig')
listdir() 可以编历目录,返回值是列表。
for fileName in os.listdir('/'): print fileName
rmdir(), removedirs() 可以删除目录或多层目录,但要求目录为空。
os.rmdir('testDir') os.removedirs('abc/efg/hig')
remove() 可以删除当个文件。
os.remove('filename')
shutil 主要包含以下函数:
copy() 复制文件,dst 可以是文件或者目录,如果是目录表示复制文件的目标目录。
copytree(src, dst) 复制目录树。注意:dst 必须要求是不存在的目录,因为它会新建目标目录。即使在 Windows 平台上使用,路径的分隔符也是 '/'(Unix 分隔符)。
rmtree() 删除目录树,目录可以不为空。
move() 移动文件或目录。
os.path 类中的相关函数可以判断指定目录是文件、目录或其他类型,例如:
path = 'test.txt' if os.path.isdir(path): print 'Directory.' elif os.path.isfile(path): print 'File.' elif os.path.islink(path): print 'Shortcut.' elif os.path.ismount(path): print 'Mount point.'
access() 函数可以判断目录权限,例如:
if not os.access('testDir', os.W_OK): mkdir 'testDir/abc'
使用 stat 类能获得更加详细的文件信息,返回值是一个字典,记录了文件的各种相关信息,例如:
import os import stat import time fileStats = os.stat('test.txt') fileInfo = { 'Size' : fileStats[stat.ST_SIZE], 'LastModified' : time.ctime(fileStats[stat.ST_MTIME]), 'LastAccessed' : time.ctime(fileStats[stat.ST_ATIME]), 'CreationTime' : time.ctime(fileStats[stat.ST_CTIME]), 'Mode' : fileStats[stat.ST_MODE] } for infoField, infoValue in fileInfo.items(): print infoField, ':' + str(infoValue) if stat.S_ISREG(fileStats[stat.ST_MODE]): print 'Regular file.' elif stat.S_ISDIR(fileSTats[stat.ST_MODE]): print 'Directory.' elif stat.S_ISLNK(fileSTats[stat.ST_MODE]): print 'Shortcut.' elif stat.S_ISSOCK(fileSTats[stat.ST_MODE]): print 'Socket.' elif stat.S_ISFIFO(fileSTats[stat.ST_MODE]): print 'Named pipe.' elif stat.S_ISBLK(fileSTats[stat.ST_MODE]): print 'Block special device.' elif stat.S_ISCHR (fileSTats[stat.ST_MODE]): print 'Character special device.'
import sys print 'The command line arguments are:' for i in sys.argv: print i print '\n\nThe PYTHONPATH is', sys.path, '\n'
Python 默认文件编码是 UTF-8,下面脚本可以将 GB2312 编码转换为 UTF-8。
import codecs fi = codecs.open("gb2312_file", "r", "gb2312") fo = codecs.open("utf8_file", "w", "UTF-8") for line in fi.readlines(): fo.write(line) fi.close() fo.close()
Linux 系统命令也可以很容易的转换编码:
iconv -f gb2312 -t utf8 inputfilename > outputfilename
Comments
There are currently no comments
New Comment