Python 系统管理

(0 comments)

本文介绍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模块可以查询操作系统平台和版本信息,如下所示:

  • sys.platform 获得操作系统的平台信息,例如:'win32', 'linux2', 'sunos5' 等。
  • sys.version 获得操作系统的版本信息,例如:linux 操作系统的内核版本等。

模块搜索路径

Python程序导入模块时,会搜索sys.path路径包含的目录,默认系统搜索路径如下所示:

>>> sys.path
['', '/usr/lib/python24.zip', '/usr/lib/python2.4', ...]

添加用户的搜索路径有两种方式:

  1. 设置系统环境变量PYTHONPATH,指向添加的模块搜索路径。
  2. 调用方法sys.path.append(str),添加模块搜索路径。

用户的模块应该放在单独的目录,并添加这个目录到模块搜索路径中。例如,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
Currently unrated

Comments

There are currently no comments

New Comment

required

required (not published)

optional

required