Total Pageviews

Saturday, 3 November 2012

Python for Linux System Admin

第一章 Python简介

(一)为什么要选择Python?

Python有哪些优越性或者有什么特性是您需要的?
Python十分容易学习
Python功能强大,可以完成你能想到的任何复杂的任务
Python代码简化方面做的非常出色,代码易维护
Python语言的可读性非常好
Python支持面向对象的编程(OOP)
Python有python社区支持
Python的标准库非常全面,几乎可以完成所有的工作
Python可以方便地获取各种各样的第三方软件包
来自于《简明Python教程》的说法
Python的特色:
简单、易学
免费、开源
解释性
高层语言
面向对象
可移植性
可扩展性
可嵌入性
丰富的库

(二)学习的动力

假如你是Bash或者perl的系统管理员中的一份子,那么完全没有必要担心Python难学。事实上Python被许多人认为是最容易讲授和学习的一门语言。
学习Python,需要的只是学习的动力、好奇心和毅力!
获得人生中的成功需要的专注与坚持不懈多过天才与机会。
                   ——C.W. Wendte
任何人都可以学习编程,具有计算机专业的学位并不是学习Python的必要条件。

(三)一些基础知识

Python像Shell一样,是解释执行的,属于解释型脚本语言。
IPython是Python的一个交互式Shell。IPython的许多特性,在我们学习Python的过程中,很有价值。

(四)在Python中执行命令

Python可以使用模块subprocess,调用系统命令。
#!/usr/bin/env python
import subprocess
subprocess.call(["ls","-l","/usr/bin"])
其中 subprocess.call(["some_comand","some_argument","another_argument_or_path"])
比如
subprocess.call(["ls","-l","/usr/bin"]) 也可以写成
subprocess.call(“ls -l /usr/bin/”, shell=True)
在IPython中获得在线帮助
使用IPython,可以通过tab自动完成功能(与Bash Shell的Tab键自动补齐功能似类)来查看模块中是否有可用的工具。
在IPython中,在一个属性之后输入问号,就会找到该属性的相关信息,而且包含该 属性的文档也会被打印出来。

(五)在Python中使用函数

在Python中,嵌套代码是通过统一的缩进格式来维护的。注意下来例子的缩进(因为WordPress的会自动处理掉半角空格,本来是四个半角空格,换成两个全角的空格了)。

#!/usr/bin/env python
import subprocess

#Command 1
def uname_func():
  uname = "uname"
  uname_arg = "-a"
  print "Gathering system information with %s command:\n" % uname
  subprocess.call([uname, uname_arg])

#Command 2
def disk_func():
  diskspace = "df"
  diskspace_arg = "-h"
  print "Gathering diskspace information %s command:\n" % diskspace
  subprocess.call([diskspace, diskspace_arg])
def main():
  uname_func()
  disk_func()
main()

(六)通过import语句实现代码复用

在python中,一个模块对应一个文件,反之亦然。我们不需要特别指定载入文件的扩展名为.py。即是说,我们模块文件的扩展名必须是.py,并且import的时候能且只能跟不带扩展名的文件名。
模块化编程的关于main()函数的技巧
在程序中不要直接运行main()函数,进行一下判断再运行:

if __name__ == "__main__":
  main()

这样,我们的程序,就可以随意被import,复用其中的函数,而不用担心输出乱七八糟了。
模块的__name__
每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。这在一个场合特别有用——就如前面所提到的,当一个模块被第一次输入的时候,这个模 块的主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的模块输入的时候不运行主块,我们该怎么做呢?这可以通过模块的 __name__属性完成。

#!/usr/bin/python
# Filename: using_name.py

if __name__ == '__main__':
  print 'This program is being run by itself'
else:
  print 'I am being imported from another module'

from..import语句
如果你想要直接输入argv变量到你的程序中(避免在每次使用它时打sys.),那么你可以使用from sys import argv语句。如果你想要输入所有sys模块使用的名字,那么你可以使用from sys import *语句。这对于所有模块都适用。一般说来,应该避免使用from..import而使用import语句,因为这样可以使你的程序更加易读,也可以避免名 称的冲突。

第2章 IPython

(一)安装IPython

(1)IPython源代码包可以在 http://ipython.scipy.org/dist/ 下载。
解压之后,有一个setup.py文件,是用python语言写成的安装程序。可以使用带install参数的命令来进行安装:
python setup.py install
(2)当然,假如发行版中已经包含了IPython,那么则可以直接使用系统的包管理系统直接安装。
(3)另外一种安装方式是Python独有 egg 包安装。Egg文件可以通过easy_install工具安装。使用easy_install工具安装IPython,只需要用户对site- package目录具有写权限,直接运行easy_install ipython.egg即可。
关于 egg
egg 是一个包含所有包数据的文件包。在理想情况中,egg 是一个使用 zip 压缩的文件,其中包括了所有需要的包文件。但是在某些情况下,setuptools 会决定(或被开关告知)包不应该是 zip 压缩的。在这些情况下,egg 只是一个简单的未曾压缩的子目录,但是里面的内容是相同的。使用单一的版本可以方便地进行转换,并可以节省一点磁盘空间,但是 egg 目录从功能和组织结构上来说都是相同的。一直使用 JAR 文件的 Java™ 技术的用户会发现 egg 非常熟悉。
引自:http://www.ibm.com/developerworks/cn/linux/l-cppeak3.html
(4)实际上IPthon不必安装即可以使用。源码中的ipython.py文件,就可以启动IPython了。这种方法可以保持site- packages目录简明。(当然因为绿色使然,所以可能需要手动设置一些参数才能完全和“安装”后的使用效果完全一样,比如PYTHONPATH变量)。


第3章 文本

(一)Python的内建功能及模块

str
字符串由一系列字符组成。
字符串类型(str)是一个强大而灵活的、能够对字符串数据进行操作处理的数据类型。
创建字符串

string1 = 'This is a string'
string2 = "This is another string"
string3 = '''This is still another string'''
string4 = """And one more string"""

与Shell、PHP不同的是,Python中,单引号与双引号没有区别,可以替换使用。
注:什么时候用单引号?什么时候用双引号?一般情况没有区别,但是当字符串中有单引号时,则字符号使用双引号;当字符串有有双引号的时候,则字符号使用单引号。这样便不需要转义了。
当字符串跨多行时,可以在单引号或者双引号内使用\n换行。另一个简洁的方法是使用三引号,三引号允许创造多行字符串。
“原始”字符串
创建字符串时,在引号前放置字母r,可以创建一个原始字符串。从根本上讲,创建一个原始字符串与创建一个非原始字符串的区别在于,Python不对原始字符串中的转义字符进行解析,而在处理普通字符串时,则对其进行解析。
转义字符

\
\\
\'
\"
\a  ASCII Bell响铃
\b  ASCII backspace退格
\f
\n
\N{name}
\r
\t
\uxxxx
\Uxxxxxxxx
\v
\ooo  oo八进制值表示的字符
\xhh  hh十六进制表示的字符

来自《Python简明教程》:
Unicode字符串
Unicode是书写国际文本的标准方法。如果你想要用你的母语如北印度语或阿拉伯语写文本,那么你需要有一个支持Unicode的编辑器。类似 地,Python允许你处理Unicode文本——你只需要在字符串前加上前缀u或U。例如,u”This is a Unicode string.”。
记住,在你处理文本文件的时候使用Unicode字符串,特别是当你知道这个文件含有用非英语的语言写的文本。