|
|
|
|
移动端

2.4.2 使用IPython交互式编程(1)

《Python Linux系统管理与自动化运维》第2章Python生态工具,在本章中,我们将依次介绍Python生态的各种工具,包括:Python内置的小工具(2.1节);包管理工具pip(2.2节);Linux和Windows下的Python编辑器(2.3节);Python交互式编程工具(2.4节);Python调试器(2.5节);Python代码规范检查工具(2.6节)。本节为大家介绍使用IPython交互式编程。

作者:赖明星来源:机械工业出版社|2017-09-28 16:14

2.4.2 使用IPython交互式编程(1)

IPython是一个第三方工具,因此,在使用之前需要先安装。可以直接使用操作系统的包管理工具或pip进行安装。如下所示:

  1. $ sudo apt-get install ipython 

安装完成以后,在命令行终端输入ipython就进入了IPython交互式编程界面:

  1. $ ipython  
  2. Python 2.7.3 (default, Jun 21 2016, 18:38:19)  
  3. Type "copyright", "credits" or "license" for more information.  
  4.  
  5. IPython 0.13.1 -- An enhanced Interactive Python.  
  6. ?         -> Introduction and overview of IPython's features.  
  7. %quickref -> Quick reference.  
  8. help      -> Python's own help system.  
  9. object?   -> Details about 'object', use 'object??' for extra details. 

与标准的Python Shell一样,IPython的第一行显示了所使用的Python解释器版本以及当前的时间。第二行是获取版权信息的方式,接着给出了IPython的版本。最后,是简短的使用说明,包括特征介绍、简短的使用手册和如何获取帮助信息。表2-2给出了IPython提供的使用说明。

接下来我们将从五个不同的维度介绍IPython的使用,分别是:①更好的编辑器;②更方便地获取帮助信息;③IPython提供的magic函数;④IPython的保存历史功能;⑤IPython与操作系统交互。

1.更好的编辑器

IPython非常强大,有各种高级功能。其中,最有用也最直观的便是作为交互式编程工具的编辑器功能。简单来说,IPython相对于标准的Python Shell是一个更好的交互式编程的编辑器,因为它具有:

语法高亮;

自动缩进;

Tab补全;

快速获取帮助信息;

搜索历史;

执行shell命令。

如果只是描述IPython的特征,相信读者并没有完全的概念。这个时候可以坐在计算机旁,打开IPython随便敲几行Python代码和标准的Python Shell进行比较,就能够直观感受到IPython的优点。图2-5和图2-6比较了Python和IPython的使用。

IPython与标准Python Shell的最大区别在于,IPython会对命令提示符的每一行进行编号,编号以后能够提高交互式编程的可读性。更重要的是,我们可以通过IPython提供的特殊函数对编号以后的代码进行操作。此外,IPython支持语法高亮和自动缩进,相对于标准的Python Shell,是一个更好的编辑器。如果在编写代码的过错中出现了错误需要删除时,标准的Python Shell无法进行很好的处理,只能重新进行输入,而IPython则不存在这样的问题。最后,在图2-6的末尾,我们演示了IPython的tab补全功能。

tab补全是一个特别有用的功能,IPython支持tab补全,而标准的Python Shell不支持。大家可以想象一下,一个工程师最近正在学习Python,他知道一个库里面有他想要的函数,但是,他并不能非常准确地说出这个函数的名称。这个时候,如果没有tab补全,就只能一边打开Python官方的参考手册,一边学习编程。有了tab补全以后,即使他对函数名称不是特别熟悉也没有关系,可以先通过tab补全列出当前命名空间下的函数列表,然后根据函数名称选择自己需要的函数。IPython的补全功能非常强大,不但可以补全用户的变量名、标准库的函数,在导入包时也可以进行补全。图2-7给出了一个包补全的例子。

这一小节,我们一直在强调IPython比标准的Python Shell更好用,拥有更多高级功能。如果读者接触Python的时间不长,也许不能理解为什么需要使用交互式编程。交互式编程在当前会话退出以后就结束了,并不满足计算机程序一次编写多次运行的特点。但是,在我们的日常工作中还是会经常用到交互式编程。交互式编程不但可以快速验证代码执行结果,还可以帮助我们学习Python编程。Python工程师在编写代码时,通常会使用编辑器和Python Shell组合的方式来完成程序的编写,例如,将代码从编辑器复制到Python Shell以验证代码的正确性,然后将验证过的代码从Python Shell复制到编辑器中。

为了便于读者理解交互式编程的好处,我们这里演示一个使用Python交互式编程的例子。在这个例子中,我们使用IPython来解析MySQL的备份日志。

一个典型的MySQL物理备份日志如下所示:

  1. 170221 01:07:48 Executing UNLOCK TABLES  
  2. 170221 01:07:48 All tables unlocked  
  3. Starting slave SQL thread  
  4. 170221 01:07:48 [00] Streaming ib_buffer_pool to <STDOUT> 
  5. 170221 01:07:48 [00]        ...done  
  6. 170221 01:07:48 Backup created in directory '/home/lmx/log/backup'  
  7. MySQL binlog position: filename 'mysql-bin.000003', position '507946128', GTID of the last change '5a81ea97-daf1-11e6-94c1-fa163ee35df3:1-3409440'  
  8. MySQL slave binlog position: master host '10.173.33.35', filename 'mysql-bin.000002', position '524993060'  
  9. 170221 01:07:48 [00] Streaming backup-my.cnf  
  10. 170221 01:07:48 [00]        ...done  
  11. 170221 01:07:48 [00] Streaming xtrabackup_info  
  12. 170221 01:07:48 [00]        ...done  
  13. xtrabackup: Transaction log of lsn (3387315364) to (3451223966) was copied.  
  14. 170221 01:07:48 completed OK! 

即使读者对MySQL不了解也没有关系,我们现在的需求是解析下面这一行日志,并获取日志中的host、filename和position的值。虽然在日志中position的值包含在一对单引号内,但是,我们希望解析以后position的值是一个整数。

  1. MySQL slave binlog position: master host '10.173.33.35', filename 'mysql-bin.000002', position '524993060' 

在这个例子中,主要就是对字符串进行处理,并提取相应的值。这个问题当然不难,但是,如果不借助交互式编程工具,需要工程师一次在代码中编写正确也不简单。如果工程师不知道交互式编程工具,就只能在编辑器里面编写代码,然后运行。如果有错误再修改,直到获取正确的取值,整个过程将会非常耗时。如果项目庞大,调试起来也会比较困难。这个时候就可以借助Python的交互式编程工具,先验证代码的正确性,然后将验证过的代码从交互式编程工具复制到编辑器中。如下所示:

  1. In [1]: line = "MySQL slave binlog position: master host '10.173.33.35', filename 'mysql-bin.000002', position '524993060'" 
  2.  
  3. In [2]: line.split("'")  
  4. Out[2]:  
  5. ['MySQL slave binlog position: master host ',  
  6.  '10.173.33.35',  
  7.  ', filename ',  
  8.  'mysql-bin.000002',  
  9.  ', position ',  
  10.  '524993060',  
  11.  '']  
  12.  
  13. In [3]: host = line.split("'")[1]  
  14.  
  15. In [4]: filename = line.split("'")[3]  
  16.  
  17. In [5]: position = line.split("'")[5]  
  18.  
  19. In [6]: print(host, filename, position)  
  20. 10.173.33.35 mysql-bin.000002 524993060  
  21.  
  22. In [7]: type(position)  
  23. Out[7]: str  
  24.  
  25. In [8]: position = int(position)  
  26.  
  27. In [9]: print(host, filename, position)  
  28. 10.173.33.35 mysql-bin.000002 524993060 

为了节省文章篇幅,我们没有进行错误的尝试,而是直接通过单引号来分解字符串。由于我们使用了交互式编程,可以很方便地看到字符串分解以后的中间结果。正是有了这个中间结果,我们才知道,字符串分解成列表以后,下标1对应的字符串是host的值,下标3对应的字符串是filename的值,下标5对应的字符串是position的值。我们还可以通过交互式编程发现position是一个字符串。由于我们要求position是一个整数,因此,需要在代码中将position强制转换为一个整数。

如果读者自己尝试从这一行字符串中获取有效的值,很可能一开始会尝试使用逗号或空格来分解字符串。这两种方法都无法一次取出host、filename和position的值。如下所示:

  1. In [10]: line.split(',')  
  2. Out[10]:  
  3. ["MySQL slave binlog position: master host '10.173.33.35'",  
  4.  " filename 'mysql-bin.000002'",  
  5.  " position '524993060'"]  
  6.  
  7. In [11]: line.split(' ')  
  8. Out[11]:  
  9. ['MySQL',  
  10.  'slave',  
  11.  'binlog',  
  12.  'position:',  
  13.  'master',  
  14.  'host',  
  15.  "'10.173.33.35',",  
  16.  'filename',  
  17.  "'mysql-bin.000002',",  
  18.  'position',  
  19.  "'524993060'"] 

使用交互式编程,我们可以快速尝试不同的方案,先验证自己的想法是否正确,然后将代码拷贝到编辑器中,组成我们的Python程序文件。通过这种方式,能够有效降低代码出错的概率,减少调试的时间,从而提高工作效率。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网管员必读—-网络安全

本书共10章,介绍的内容包括恶意软件(包括病毒、木马和蠕虫等)的深度防御方法,黑客的主要类型和防御方法,企业网络内、外部网络防火墙系...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊