Linux中Python编程和脚本编写入门
2019/03/14 20:22:25 来源:Linux社区 作者:Linux

众所周知(并且招聘机构通常需要)系统管理员需要精通脚本语言。 虽然我们大多数人可能习惯使用Bash(或我们选择的其他shell)来运行命令行脚本,但像Python这样强大的语言可以增加几个好处。

首先,我们会使用 Python 的命令行工具,还会接触到 Python 的面向对象特性(这篇文章的后半部分会谈到它)。

学习 Python 可以助力于你在桌面应用开发及数据科学领域的职业发展。

容易上手,广泛使用,拥有海量“开箱即用”的模块(它是一组包含 Python 语句的外部文件),Python 理所当然地成为了美国计算机专业大学生在一年级时所上的程序设计课所用语言的不二之选。

在这个由两篇文章构成的系列中,我们将回顾 Python 的基础部分,希望初学编程的你能够将这篇实用的文章作为一个编程入门的跳板,和日后使用 Python 时的一篇快速指引。

Linux 中的 Python

Python 2.x 和 3.x 通常已经内置在现代 Linux 发行版中,你可以立刻使用它。你可以终端模拟器中输入 pythonpython3 来进入 Python shell, 并输入 quit() 退出。

linuxidc@linuxidc:~/www.linuxidc.com/Linux公社 -$ which python
/usr/bin/python
linuxidc@linuxidc:~/www.linuxidc.com/Linux公社 -$ which python3
/usr/local/bin/python3
linuxidc@linuxidc:~/www.linuxidc.com/Linux公社 -$ python -V
Python 2.7.15rc1
linuxidc@linuxidc:~/www.linuxidc.com/Linux公社 -$ python3 -V
Python 3.8.0a2
linuxidc@linuxidc:~/www.linuxidc.com/Linux公社 -$ python
Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
linuxidc@linuxidc:~/www.linuxidc.com/Linux公社 -$ python3
Python 3.8.0a2 (default, Feb 27 2019, 18:45:42)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()

Linux中Python编程和脚本编写入门

在 Linux 中运行 Python 命令

如果你希望在键入 python 时使用 Python 3.x 而不是 2.x,你可以像下面一样更改对应的符号链接:

Linux中Python编程和脚本编写入门

 
$ cd /usr/bin

$ sudo rm /usr/bin/python

$ ln-s python3.6 python #在这里选择Python3.x二进制文件

Linux中Python编程和脚本编写入门

Linux中Python编程和脚本编写入门

删除 Python 2,使用 Python 3

顺便一提,有一点需要注意:尽管 Python 2.x 仍旧被使用,但它并不会被积极维护。因此,你可能要考虑像上面指示的那样来切换到 3.x。2.x 和 3.x 的语法有一些不同,我们会在这个系列文章中使用后者。

另一个在 Linux 中使用 Python 的方法是通过 IDLE (Python 集成开发环境(the Python Integrated Development Environment)),这是一个为编写 Python 代码而生的图形用户界面。在安装它之前,你最好查看一下适用于你的 Linux 发行版的 IDLE 可用版本。

Linux中Python编程和脚本编写入门

# aptitude search idle [Debian及其衍生发行版]
#yum search idle [CentOS和Fedora]
# dnf search idle [Fedora23+版本]

然后,你可以像下面一样安装它:

sudo aptitude install idle-python2.7# 我用的是Ubuntu 18.04

sudo aptitude install idle-python3.6 # 我用的是Ubuntu 18.04

安装好之后直接在/usr/share/applications,就可以找到IDLE的图标,直接将其复制到桌面上,以后直接在桌面双击就可以启动。

或者在终端输入: /usr/bin/idle-python3.6即可启动。

安装成功后,你会看到 IDLE 的运行画面。它很像 Python shell,但是你可以用它做更多 Python shell 做不了的事。

比如,你可以:

轻松打开外部文件 (File → Open);

Linux中Python编程和脚本编写入门

Linux中Python编程和脚本编写入门

复制 (Ctrl + C) 和粘贴 (Ctrl + V) 文本;

查找和替换文本;

显示可能的代码补全(一个在其他 IDE 里可能叫做“智能感知”或者“自动补完”的功能);

更改字体和字号,等等。

最厉害的是,你可以用 IDLE 创建桌面应用。

我们在这两篇文章中不会开发桌面应用,所以你可以根据喜好来选择 IDLE 或 Python shell 去运行下面的例子。

Python 中的基本运算

就像你预料的那样,你能够直接进行算术操作(你可以在你的所有运算中使用足够多的括号!),还可以轻松地使用 Python 拼接字符串。

你还可以将运算结果赋给一个变量,然后在屏幕上显示它。Python 有一个叫做拼接 (concatenation) 的实用功能——给 print 函数提供一串用逗号分隔的变量和/或字符串,它会返回一个由你刚才提供的变量依序构成的句子:

Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> a =6
>>> b =9
>>> x = b / a
>>> x
1.5
>>> print(b,"divided by", a,"equals", x)
9 divided by 6 equals 1.5
>>>

注意,你可以将不同类型的变量(数字,字符串,布尔符号等等)混合在一起。当你将一个值赋给一个变量后,你可以随后更改它的类型,不会有任何问题(因此,Python 被称为动态类型语言)。

如果你尝试在静态类型语言中(如 Java 或 C#)做这件事,它将抛出一个错误。如下图

Linux中Python编程和脚本编写入门

学习 Python 的基本操作x = "Now x is a string"

面向对象编程的简单介绍

在面向对象编程(OOP)中,程序中的所有实体都会由对象的形式呈现,并且它们可以与其他对象交互。因此,对象拥有属性,而且大多数对象可以执行动作(这被称为对象的方法)。

举个例子:我们来想象一下,创建一个对象“狗”。它可能拥有的一些属性有颜色品种年龄等等,而它可以完成的动作有 叫()吃()睡觉(),诸如此类。

你可以看到,方法名后面会跟着一对括号,括号当中可能会包含一个或多个参数(向方法中传递的值),也有可能什么都不包含。

我们用 Python 的基本对象类型之一——列表来解释这些概念。

解释对象的属性和方法:Python 中的列表

列表是条目的有序组合,而这些条目所属的数据类型并不需要相同。我们像下面一样来使用一对方括号,来创建一个名叫 rockBands 的列表:

你可以向 rockBandsappend() 方法传递条目,来将它添加到列表的尾部,就像下面这样:

>>> rockBands =[]
>>> rockBands.append("linuxmi")
>>> rockBands.append("linuxidc.com")
>>> rockBands.append("Linux公社www.linuxidc.com")
>>> rockBands.remove("linuxmi")
>>> rockBands.pop(0)
'linuxidc.com'
>>> rockBands.pop(0)
'Linux公社www.linuxidc.com'
>>> rockBands.pop(0)

为了从列表中移除元素,我们可以向 remove() 方法传递特定元素,或向 pop() 中传递列表中待删除元素的位置(从 0 开始计数)。

换句话说,我们可以用下面这种方法来从列表中删除 “linuxmi”:

>>> rockBands.remove("linuxmi")

或者用这种方法:

>>> rockBands.pop(0)

因为已经删除了linuxmi,所以linuxidc.com变成了在 0 位置的元素,见下图

如果你输入了对象的名字,然后在后面输入了一个点,你可以按 Ctrl + space 来显示这个对象的可用方法列表。

Linux中Python编程和脚本编写入门

 列出可用的 Python 方法

列表中含有的元素个数是它的一个属性。它通常被叫做“长度”,你可以通过向内建函数 len 传递一个列表作为它的参数来显示该列表的长度(顺便一提,之前的例子中提到的 print 语句,是 Python 的另一个内建函数)。

如果你在 IDLE 中输入 len,然后跟上一个不闭合的括号,你会看到这个函数的默认语法:

len(rockBands)

Linux中Python编程和脚本编写入门

Python 的 len 函数

现在我们来看看列表中的特定条目。它们也有属性和方法吗?答案是肯定的。比如,你可以将一个字符串条目转换为大写形式,并获取这个字符串所包含的字符数量。像下面这样做:

Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> rockBands =[]
>>> rockBands.append("linuxmi")
>>> rockBands.append("linuxidc.com")
>>> rockBands.append("Linux公社www.linuxidc.com")
>>> len(rockBands)
3
>>> rockBands[0].upper()
'LINUXMI'
>>> len(rockBands[0])
7
>>>

Linux中Python编程和脚本编写入门

总结

在这篇文章中,我们简要介绍了 Python、它的命令行 shell、IDLE,展示了如何执行算术运算,如何在变量中存储数据,如何使用 print 函数在屏幕上重新显示那些数据(无论是它们本身还是它们的一部分),还通过一个实际的例子解释了对象的属性和方法。

下一篇文章中,我们会展示如何使用条件语句和循环语句来实现流程控制。我们也会解释如何编写一个脚本来帮助我们完成系统管理任务。

像往常一样,如果你对这篇文章有什么问题,可以向我们寻求帮助。你可以使用下面的联系表单向我们发送留言,我们会尽快回复你。

更多详情见请继续阅读下一页的精彩内容https://www.linuxidc.com/Linux/2019-03/157488p2.htm


我们向你介绍了 Python 的简介,它的命令行 shell 和 IDLE。我们也演示了如何进行算术运算、如何在变量中存储值、还有如何打印那些值到屏幕上。最后,我们通过一个练习示例讲解了面向对象编程中方法和属性概念。

在 Python 编程中写 Linux Shell 脚本

本篇中,我们会讨论控制流(根据用户输入的信息、计算的结果,或者一个变量的当前值选择不同的动作行为)和循环(自动重复执行任务),接着应用我们目前所学东西来编写一个简单的 shell 脚本,这个脚本会显示操作系统类型、主机名、内核版本、版本号和机器硬件架构。

这个例子尽管很基础,但是会帮助我们证明,比起使用一般的 bash 工具,我们通过发挥 Python 面向对象的特性来编写 shell 脚本会更简单些。

也就是说,我们想从这里出发:

linuxidc@linuxidc:~/www.linuxidc.com/Linux公社 -$ uname -snrvm
Linux linuxidc 4.18.0-16-generic #17~18.04.1-Ubuntu SMP Tue Feb 12 13:35:51 UTC 2019 x86_64

Linux中Python编程和脚本编写入门

检查 Linux 的主机名

Linux中Python编程和脚本编写入门

用 Python 脚本来检查 Linux 的主机名

或者

Linux中Python编程和脚本编写入门

用脚本检查 Linux 系统信息

看着不错,不是吗?那我们就挽起袖子,开干吧。

Python 中的控制流

如我们刚说那样,控制流允许我们根据一个给定的条件,选择不同的输出结果。在 Python 中最简单的实现就是一个 if/else 语句。

基本语法是这样的:

  1. if条件:
  2. #动作1
  3. else:
  4. #动作2

当“条件”求值为真(true),下面的代码块就会被执行(# 动作 1代表的部分)。否则,else 下面的代码就会运行。 “条件”可以是任何表达式,只要可以求得值为真或者假。

举个例子:

  1. 1 < 3 # 真
  2. firstName == "Linuxidc" # 对 firstName 为 Linuxidc 的人是真,对其他不叫 Linuxidc 的人为假

请注意,if/else 表达式只是 Python 中许多控制流工具的一个而已。我们先在这里了解以下,后面会用在我们的脚本中。你可以在官方文档中学到更多工具。

Python 中的循环

简单来说,一个循环就是一组指令或者表达式序列,可以按顺序一直执行,只要条件为真,或者对列表里每个项目执行一一次。

Python 中最简单的循环,就是用 for 循环迭代一个给定列表的元素,或者对一个字符串从第一个字符开始到执行到最后一个字符结束。

基本语句:

for x in example:

#dothis

这里的 example 可以是一个列表或者一个字符串。如果是列表,变量 x 就代表列表中每个元素;如果是字符串,x 就代表字符串中每个字符。

>>> rockBands =[]
>>> rockBands.append("linux")       
>>> rockBands.append("Linux公社www.linuxidc.com")
>>> rockBands.append("debian")
>>> for x in rockBands:
...     print(x)
...
linux
Linux公社www.linuxidc.com
debian
>>> firstName = "Linux公社欢迎您www.linuxidc.com"
>>> for x in firstName:
...     print(x)

上面例子的输出如下图所示:

Linux中Python编程和脚本编写入门

学习 Python 中的循环

Python 模块

很明显,必须有个办法将一系列的 Python 指令和表达式保存到文件里,然后在需要的时候取出来。

准确来说模块就是这样的。比如,os 模块提供了一个到操作系统的底层的接口,可以允许我们做许多通常在命令行下执行的操作。

没错,os 模块包含了许多可以用来调用的方法和属性,就如我们之前文章里讲解的那样。不过,我们需要使用 import 关键词导入(或者叫包含)模块到运行环境里来:

>>>import os

我们来打印出当前的工作目录:

>>> os.getcwd()

Linux中Python编程和脚本编写入门

学习 Python 模块

现在,让我们把这些结合在一起(包括之前文章里讨论的概念),编写需要的脚本。

Python 脚本

以一段声明文字开始一个脚本是个不错的想法,它可以表明脚本的目的、发布所依据的许可证,以及一个列出做出的修改的修订历史。尽管这主要是个人喜好,但这会让我们的工作看起来比较专业。

这里有个脚本,可以输出这篇文章最前面展示的那样。脚本做了大量的注释,可以让大家可以理解发生了什么。

在进行下一步之前,花点时间来理解它。注意,我们是如何使用一个 if/else 结构,判断每个字段标题的长度是否比字段本身的值还大。

基于比较结果,我们用空字符去填充一个字段标题和下一个之间的空格。同时,我们使用一定数量的短线作为字段标题与其值之间的分割符。

#!/usr/bin/python3
#如果你没有安装Python3,那么修改这一行为#!/usr/bin/python
#Script name:uname.py
#Purpose:IllustratePython OOP capabilities to write shell scripts more easily
#License: GPL v3 (http://www.gnu.org/licenses/gpl.html)
#Copyright(C)2016LinuxidcAlejandro C&aacute;nepa
#​Facebook/Skype/ G+/ Twitter /Github: gacanepa
#Email: gacanepa (at) gmail (dot) com
#This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU GeneralPublicLicenseas published by
# the FreeSoftwareFoundation, either version 3 of the License,or
#(at your option) any later version.
#This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
# GNU GeneralPublicLicenseformore details.
#You should have received a copy of the GNU GeneralPublicLicense
# along withthis program.Ifnot, see .
# REVISION HISTORY
# DATE VERSION AUTHOR CHANGE DESCRIPTION
#-------------------------------
#2016-05-281.0Linuxidc C&aacute;nepa Initial version
### 导入 os 模块
import os
### 将 os.uname() 的输出赋值给 systemInfo 变量
### os.uname() 会返回五个字符串元组(sysname, nodename, release, version, machine)
### 参见文档:https://docs.python.org/3.2/library/os.html#module-os
systemInfo = os.uname()
### 这是一个固定的数组,用于描述脚本输出的字段标题
headers =["Operating system","Hostname","Release","Version","Machine"]
### 初始化索引值,用于定义每一步迭代中
### systemInfo 和字段标题的索引
index =0
### 字段标题变量的初始值
caption =""
### 值变量的初始值
values =""
### 分隔线变量的初始值
separators =""
### 开始循环
for item in systemInfo:
if len(item)&lt; len(headers[index]):
### 一个包含横线的字符串,横线长度等于item[index] 或 headers[index]
### 要重复一个字符,用引号圈起来并用星号(*)乘以所需的重复次数
separators = separators +"-"* len(headers[index])+" "
caption = caption + headers[index]+" "
values = values + systemInfo[index]+" "*(len(headers[index])- len(item))+" "
else:
separators = separators +"-"* len(item)+" "
caption = caption + headers[index]+" "*(len(item)- len(headers[index])+1)
values = values + item +" "
### 索引加 1
index = index +1
### 终止循环
### 输出转换为大写的变量(字段标题)名
print(caption.upper())
### 输出分隔线
print(separators)
#输出值(systemInfo 中的项目)
print(values)
### 步骤:
### 1) 保持该脚本为 uname.py (或任何你想要的名字)
### 并通过如下命令给其执行权限:
### chmod +x uname.py
### 2) 执行它;
### ./uname.py

如果你已经按照上述描述将上面的脚本保存到一个文件里,并给文件增加了执行权限,那么运行它:

#chmod+x uname.py

#./uname.py

如果试图运行脚本时你得到了如下的错误:

-bash:./uname.py:/usr/bin/python3: bad interpreter:No such fileor directory

这意味着你没有安装 Python3。如果那样的话,你要么安装 Python3 的包,要么替换解释器那行(如果如之前文章里概述的那样,跟着下面的步骤去更新 Python 执行文件的软连接,要特别注意并且非常小心):

#!/usr/bin/python3

#!/usr/bin/python

这样会通过使用已经安装好的 Python 2 去执行该脚本。

注意:该脚本在 Python 2.x 与 Pyton 3.x 上都测试成功过了。

尽管比较粗糙,你可以认为该脚本就是一个 Python 模块。这意味着你可以在 IDLE 中打开它(File → Open… → Select file):

Linux中Python编程和脚本编写入门

在 IDLE 中打开 Python

一个包含有文件内容的新窗口就会打开。然后执行 Run → Run module(或者按 F5)。脚本的输出就会在原始的 Shell 里显示出来:

Linux中Python编程和脚本编写入门

执行 Python 脚本

如果你想纯粹用 bash 写一个脚本,也获得同样的结果,你可能需要结合使用 awk、sed,并且借助复杂的方法来存储与获得列表中的元素(不要忘了使用 tr 命令将小写字母转为大写)。

另外,在所有的 Linux 系统版本中都至少集成了一个 Python 版本(2.x 或者 3.x,或者两者都有)。你还需要依赖 shell 去完成同样的目标吗?那样你可能需要为不同的 shell 编写不同的版本。

这里演示了面向对象编程的特性,它会成为一个系统管理员得力的助手。

注意:你可以在我的 Github 仓库里获得 这个 python 脚本(或者其他的)。

总结

这篇文章里,我们讲解了 Python 中控制流、循环/迭代、和模块的概念。我们也演示了如何利用 Python 中面向对象编程的方法和属性来简化复杂的 shell 脚本。

你有任何其他希望去验证的想法吗?开始吧,写出自己的 Python 脚本,如果有任何问题可以咨询我们。不必犹豫,在分割线下面留下评论,我们会尽快回复你。

更多Python相关信息见Python 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=17

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2019-03/157488.htm

更多Python相关信息见Python 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=17

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2019-03/157488.htm


6

本栏最新