测试工程师Python开发实战

978-7-115-61293-9
作者: 胡通
译者:
编辑: 孙喆思
分类: Python

图书目录:

详情

本书是为测试人员编写的Python开发实战指南,包含Python的核心知识点和实战案例,帮助测试人员快速掌握Python工具开发技能。本书共3篇:基础篇(第1章至第3章)介绍Python和PyCharm工具的安装与环境部署,并讲解日常实际工作中用到的Python基础知识点;专题篇(第4章至第6章)介绍Python开发时使用频度较高的常用技能如异常处理、日志处理、邮件处理等,高级技能如Kafka、Redis、MySQL等,以及通用框架如FastAPI、Celery和Scrapy;实战篇(第7章至第12章)分享一些实际应用,包括音频测试工具、自定义套接字测试工具、接口测试工具、数据测试工具、性能测试工具、安全测试工具等6种测试工具的开发实战。

图书摘要

版权信息

书名:测试工程师Python开发实战

ISBN:978-7-115-61293-9

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    胡 

责任编辑 孙喆思

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e61293”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

内 容 提 要

本书是为测试人员编写的Python开发实战指南,包含Python的核心知识点和实战案例,帮助测试人员快速掌握Python工具开发技能。本书共3篇:基础篇(第1章至第3章)介绍Python和PyCharm工具的安装与环境部署,并讲解日常实际工作中用到的Python基础知识点;专题篇(第4章至第6章)介绍Python开发时使用频度较高的常用技能如异常处理、日志处理、邮件处理等,高级技能如Kafka、Redis、MySQL等,以及通用框架如FastAPI、Celery和Scrapy;实战篇(第7章至第12章)分享一些实际应用,包括音频测试工具、自定义套接字测试工具、接口测试工具、数据测试工具、性能测试工具、安全测试工具等6种测试工具的开发实战。

本书始终贯穿“二八定律”、封装复用和质量自测的指导思想,结构清晰,案例丰富,实用性强,适合使用Python进行测试开发的读者阅读和提升,也适合Python初学者参考学习。

前  言

为什么写本书

在高速发展的数字化时代,到处都有不可预知的变化,有的来自客户需求的变化,有的来自市场环境的变化,这些变化给企业的市场、渠道、产品、服务等各方面都带来了一系列新的挑战,每个成功的企业都在培养和提升快速适应这种变化的能力。对企业的产品研发部门而言,面对愈发不确定的客户需求,快速并高质量地完成项目开发工作,早日上线项目,尽早收集市场反馈,优化产品和服务,是响应市场变化的基本原则。但在追求产品快速交付上线的同时,质量底线是每个成功的产品都必须要坚守的,这意味着研发团队在提高产品交付效率的同时要保证产品质量,而要实现这一目标,引入自动化测试和测试左移是行之有效的手段。

“人生苦短,我用Python”。当前各行各业都在“内卷”,大家都充满了危机感,活到老学到老。以我的经验而言,在学习新知识的时候,不应该在掌握全部知识点之后再去完成任务,而应该依据“二八定律”,在掌握20%的核心知识点后着手实践,剩余的80%的知识点在大部分情况下是用不到的。尤其对于非专职的开发人员(如测试人员),在自我提升进阶的过程中,看了一堆Python语法之后,还是不能很好地掌握日常的开发技能。一方面是因为大多数图书偏重理论讲解,或者案例过于生活化,脱离真实的工作需求;另一方面是因为大家自学会感到迷茫,常常觉得不会学、坚持不下来、不知道学什么、学完又不知道做什么。总而言之,对于太入门的知识,我们容易找不到未来定位;对于太进阶的知识,我们又不好理解上手。

在写本书之前,我的内心是纠结和矛盾的,一方面,自认为水平有限,开发技术不是特别出色;另一方面,最近两年一直从事研发管理的工作,对技术钻研的投入比较少。但是我在学习Python的道路上和千千万万读者一样,也遇到过各种困惑、问题、曲折,本着分享的精神,我构思了本书的内容,希望通过构建简洁的学习路径,提炼核心知识,并结合我在日常工作中开发的小而实用的测试工具,帮助读者快速地掌握开发技能,并应用到实际工作中去,提升工作效率。因此,本书涉及的知识点不追求大而全,但是会涵盖实际开发过程中常用的内容。若本书能够给读者带来一些启示和思考,那将是我的荣幸。

阅读本书能收获什么

通过阅读本书,读者可以快速掌握Python的20%的核心知识点,然后依托于测试工具开发实战,轻松理解Python开发的思路,快速提高开发能力。本书实用性强,覆盖面广,是一本测试人员或开发人员学习Python的不可多得的实战类好书。

由浅入深,循序渐进,掌握Python。本书从Python基础入手,再到通用能力和通用框架的专题知识,最后是丰富的实战案例,通俗易懂、图文并茂,让读者快速掌握Python知识。

示例典型,轻松易学,快速上手。本书通过丰富的示例代码,让读者轻松了解实际开发场景。书中的关键代码还提供相应的注释,便于读者阅读代码,快速上手Python开发。

精彩栏目,贴心提示,技能提升。本书在各章设置了很多提示、注意等栏目,让读者可以在学习过程中轻松地理解相关知识点及概念,助力读者的Python开发技能提升。

本书适合哪些读者

互联网从业人员,尤其是测试人员和开发人员。

有一定Python基础,追求技能提升的非互联网从业人员。

对借助Python提升工作效率或办公自动化有需求的人员。

如何阅读本书

本书在内容上注重经验的价值、可学习性和可借鉴性;在结构上设置基础、专题、实战共3篇;在形式上结合图文与提示、注意等栏目,立体地分享和展示知识点。书中每章的知识点都具有一定的广度,值得读者细细地品味和思考,并且各章之间相对独立,读者可以从任意一章开始阅读,快速学习,全面提升开发技能,丰富自己的知识体系。全书共3篇:基础篇重点讲解安装部署和基础知识;专题篇重点讲解常用操作、工具和框架;实战篇重点讲解如何开发测试工具。其中,实战篇从需求背景、涉及知识、代码解读 3 方面展开,站在质量角度介绍如何实现开发工具,完成产品质量提升。

第1章介绍Python环境,包括Python简介、Python安装升级、pip管理工具包和Python虚拟环境4个方面。

第2章介绍Python代码编辑器PyCharm工具,包括安装配置和众多常用功能。

第3章介绍Python基础,包括基本数据类型,面向对象和面向过程两种编程方式等内容,总结提炼Python语法中20%的核心知识。

第4章提炼出使用频度较高的内容,包括自定义异常处理、日志处理、邮件处理、时间处理等常用技能。

第5章讲解消息中间件、缓存中间件、数据库中间件的使用,包括Kafka、Redis和MySQL等中间件。

第6章讲解3个通用框架,包括Web应用框架FastAPI、异步处理框架Celery和爬虫框架Scrapy。

第7章介绍如何实现MP3和WAV两种音频文件格式的校验和转换。

第8章介绍如何借助socket库和struct库开发一个自定义套接字测试工具。

第9章介绍如何借助requests库开发一个轻量级的接口测试工具。

第10章介绍如何借助pandas库处理大数据的结果并结合pyecharts库开发一个数据测试工具。

第11章介绍如何结合JMeter开发一个自动调用、执行性能脚本和处理结果的性能测试工具。

第12章介绍如何利用python-nmap库进行端口扫描,开发一个安全测试工具。

在配套资源中,我们提供测试开发的3点思考、常用的Python代码片段、Python性能优化技巧等实用内容,供广大读者参考。

致谢

回顾这一年多的写作历程,我不由得心生感叹,这是一个痛并快乐的过程。这是我的第二本书,我深感写书是件不容易的事,熬过很多个周末,耗费很多心血,在写作过程中要克服拖延、动摇等情绪。但不论如何,这是一个沉淀和收获的过程。我在完成本书的写作时,油然而生的是深深的满足感。互联网行业的工程师就好比运动员,要想在竞技场上获胜,就需要在训练场里长期刻苦地练习技巧,想要成为一个不被时代抛弃的技术人,就需要不断地更新迭代自己的知识体系,提高综合技术能力,扩展知识面,完成从小白到专家的蜕变。我与读者共勉!

借此机会,我要感谢公司给予的广阔成长空间,感谢部门领导、团队组长和同事们的悉心指导;感谢人民邮电出版社编辑们的大力支持,尤其是孙喆思编辑,在写书过程中,她提供了不少好的建议和帮助。最后,我要感谢家人和朋友的鼓励,正是他们的理解与鞭策让我保持动力准时完稿。

谨以此书献给孜孜不倦的互联网“打工人”,我们一起学习、成长、进步!

资源与支持

本书由异步社区出品,社区(https://www.epubit.com)为您提供相关资源和后续服务。

您还可以扫码二维码, 关注【异步社区】微信公众号,回复“e61293”直接获取,同时可以获得异步社区15天VIP会员卡,近千本电子书免费畅读。

配套资源

本书提供测试开发的3点思考、常用的Python代码片段、Python性能优化技巧等配套学习资料,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

提交勘误

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

扫码关注本书

扫描下方二维码,您将会在异步社区微信服务号中看到本书信息及相关的服务提示。

与我们联系

本书责任编辑的联系邮箱是sunzhesi@ptpress.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频或者参与技术审校等工作,可以直接发邮件给本书的责任编辑。

如果您来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端和网络技术等。

异步社区

微信服务号

第一篇 基础篇

己之力,初入职场。面对一门全新的编程语言Python,大家是会拿着一本厚厚的Python基础知识大全从头到尾地学习呢,还是根据项目需要重点优先学习项目涉及的知识点呢?答案显而易见,相信大多数读者都会选择后者,但是实际上,还是有很多新手会在学习的时候陷入一个怪圈:明明自己在很努力地看书,几个月后,却发现自己永远在学习图书前一二章的内容。因为我们每次打开图书,都会发现之前看过的已经遗忘了,索性就又从头看一遍,久而久之,每次兴致勃勃地看书,却永远在重复看前面的内容,到最后没精力和机会学习后面的知识了。笔者根据个人的经验,建议大家在实际工作中采用“以练代学”的方式,这样掌握知识比较可靠,而且学习后的即时反馈也更加直接,大家会比较容易获得成就感和满足感,形成良性循环。

  笔者认为在学习一门新知识时“二八定律”是适用的,即只需要优先掌握20%的知识点,就能满足80%的工作需要了。本着这个定律,本书的基础篇不会涵盖所有的Python基础语法知识点,因为市面上已经有很多系统性的图书了。Python语法众多,工具也不少,而想要快速掌握Python以满足工作需要,我们只需要重点掌握其中20%的内容。

  基础篇只涉及在实际工作中会用到的内容,共3章,第1章是Python环境,包括安装部署Python、虚拟环境、包管理等内容;第2章是PyCharm工具,包括PyCharm的简介、配置环境、常用功能等内容;第3章是Python基础,核心是数据类型、面向对象编程和面向过程编程等内容。

第1章 Python环境

如今Python版本众多,学习Python,首先需要学会如何安装部署不同的版本,然后学会如何搭建基础的虚拟环境,方便多项目的开发管理,最后学会如何使用第三方工具(库和模块),通过“站在别人的肩膀上”,复用功能模块,提升工作效率。本章从Python简介、Python安装升级、pip管理工具包、Python虚拟环境4个方面逐一讲解。接下来,我们就正式开始Python的开发学习。

1.1 Python简介

Python是一种解释型、面向对象的高级程序设计语言。Python是一种解释型语言,这意味着开发过程中没有编译这个环节,类似于PHP和Perl。Python是面向对象语言,这意味着Python支持面向对象的风格或代码封装在对象中的编程技术。

1.1.1 Python的特点

通常,Python具有易于学习、易于阅读、易于维护、标准库丰富、可移植、可扩展、可嵌入等特点,如表1-1所示。

表1-1 Python的特点

特点

描述

易于学习

Python有相对较少的关键字,结构简单,语法明了,学习起来更加简单

易于阅读

Python代码定义更清晰

易于维护

Python源代码是相对容易维护的

标准库丰富

Python具有丰富的库,而且跨平台,其对UNIX、Windows和macOS能很好地兼容

可移植

基于其开放源代码的特性,Python可被移植到许多平台

可扩展

如果需要一段运行很快的关键代码,或者想要编写一些不愿开放的算法,可以使用C或C++
完成那部分程序,然后在Python程序中调用

可嵌入

可以将Python嵌入C/C++程序,让使用程序的用户获得“脚本化”能力

1.1.2 Python的用途

学习Python,我们可以从事Web应用开发、网络爬虫、人工智能、数据分析、自动化运维等相关领域的工作,具体的岗位如Python爬虫工程师、大数据工程师、人工智能工程师等。

下面我们具体介绍Python的用途。

(1)Web应用开发。因为Python是一种解释型的脚本语言,开发效率高,所以非常适合用来做Web应用开发。Python有上百种Web应用开发框架,有很多成熟的模板技术,选择Python开发Web应用,不仅开发效率高,而且运行速度快。常用的Web应用开发框架有Django、Flask、Tornado等。许多知名的互联网企业也将Python作为主要的Web应用开发语言,例如豆瓣、知乎、Google、YouTube、Facebook等。

(2)网络爬虫。网络爬虫是Python比较常用的一个应用场景,Google在早期大量地使用Python语言作为网络爬虫的基础,带动了整个Python语言的应用发展。以前国内很多人用采集器搜集网上的信息,现在用网络爬虫收集网上的信息比以前容易很多了,例如从各大网站爬取商品折扣信息,比较获取最优选择;对社交网络上发言进行收集和分类,生成情绪地图,分析语言习惯;爬取网易云音乐某一类歌曲的所有评论,生成词云;按条件筛选获得豆瓣的电影、图书信息并生成表格等。应用实在太多,几乎每个人学会使用网络爬虫之后都能够通过网络爬虫去做一些有趣且有用的事。

(3)人工智能。人工智能是现在非常火的一个方向,人工智能热潮让Python语言的未来充满了无限的可能。目前几个非常有影响力的人工智能框架,大多是通过Python实现的,这是因为Python有很多工具方便做人工智能,例如NumPy、SciPy可用于数值计算,scikit-learn可用于机器学习,PyBrain可用于神经网络,matplotlib可用于数据可视化。但是,人工智能的大部分核心算法的实现还是依赖于C/C++的,因为人工智能的核心算法是计算密集型的,需要非常精细的优化,还需要GPU、专用硬件之类的接口,这些都只有C/C++能做到。

(4)数据分析。Python在数据分析处理方面有很完备的生态环境。大数据分析中涉及的分布式计算、数据可视化、数据库操作等,我们都可以选择Python中成熟的模块完成其功能。例如,对于Hadoop MapReduce和Spark,都可以直接使用Python完成其计算逻辑,这无论对于数据科学家还是对于数据分析师都是十分便利的。

(5)自动化运维。Python对于服务器运维也有十分重要的用途。由于目前几乎所有Linux发行版中都自带了Python解释器,因此在Linux服务器上使用Python脚本进行批量化的文件部署和运行调整是很不错的选择。从调控SSH/SFTP用的paramiko,到监控服务用的supervisor等,Python提供了全方位的工具集合,在这个基础上,结合Web应用,开发运维工具也会变得十分简单。

1.1.3 Python的历史

Python现在有两个大版本、很多小版本,Python的版本号如图1-1所示。

Python的两个大版本,一个是Python 2,另一个是Python 3。Python 2的第一个发行版本是在2000年10月官方发布的。于2020年1月1日,Python 2停止更新,这意味着Python 2.7成为最后一个Python 2的小版本,现在很多CentOS原始自带的还是Python 2.7的。

图1-1 Python的版本号

Python 3和Python 2在语法使用上是有一些区别的,建议新手学习或构建新项目的时候就采用Python 3。Python的较新版本如图1-2所示,本书采用的是Python 3.9.8。

图1-2 Python的较新版本

提示

Python的版本号规则,通常分3段,即为A.B.C。其中,A表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小修改,如修复bug,只要有修改就增加C。

正确的学习方式将帮助我们快速成长为一名优秀的Python开发人员。下面是几条建议,供大家参考。

(1)明确学习目标。在学习Python之前,目标应该很明确。Python是一种简单而应用广泛的语言,它包括许多库、模块、内置函数和数据结构。因此,我们首先要弄清楚学习的动机,根据兴趣选择一个或两个领域,例如数据分析处理、游戏等,然后开始学习Python。

(2)学习20%基础语法。学习Python的语法是最重要和最基本的步骤。在深入学习Python的语法之前,我们必须学习其基础语法。而只需要重点、优先掌握其中20%的知识即可满足大部分的项目需求。因此,我们可以花费最少的时间来学习其语法。一旦我们正确地掌握了其语法,就可以更轻松、更快速地进行项目工作。

(3)动手实践编写代码。编写代码是学习Python的最有效、最可靠的方法。在这个过程中,我们务必亲自编写代码,而不是复制粘贴,编写代码将帮助我们快速熟悉相关的语法和概念。注意,在编写代码时,请尝试使用合适的函数和合适的变量名称,尽可能做到合规、专业。

(4)尝试做小型项目。在了解Python的基础语法和有一定的代码编写经验之后,初学者应该尝试做一些小型项目。这将有助于我们更深入地了解Python中的更多组件。我们可以从小型项目开始,如闹钟应用、待办事项列表、客户管理系统等。当顺利完成一个小项目的开发时,成功的喜悦感会油然而生,这将进一步增加我们学习的动力,以深入更高级的领域。

(5)与别人分享。“如果你想学习一些东西,那么你应该教别人”。在学习Python时也是如此,通过创建博客、微信公众号等,与其他人分享知识。这将帮助我们增进对Python的理解,并探索自己知识中未发现的不足。

(6)探索工具和框架。Python由庞大的工具库和各种框架组成。熟悉Python的基础语法之后,下一步就是探索Python工具。这些工具对于处理特定域的项目是必不可少的。我们要懂得复用,站在巨人的肩膀上,减少重复工作,提高工作效率。

(7)为开源做贡献。众所周知,Python是一种开源语言,这意味着每个人都可以免费使用它。我们可以为Python在线社区做出贡献,以增强我们的知识价值。为开源项目做贡献是探索知识的最佳方法。我们还会收到对我们提交的工作的反馈、评论或建议。这将进一步促使我们成为一名优秀的Python开发人员。

1.2 Python安装升级

转眼间现在Python都有3.10版本了,Python更新很快,Python的历史版本如图1-3所示。所以,本书中所有后续代码演示使用3.9版本,即图1-3中的3.9.8版本。

图1-3 Python的历史版本

1.2.1 Python安装

本书中使用的服务器操作系统为CentOS Linux release 7.6.1810 (Core),其内核发行版本为3.10.0,如图1-4所示。

图1-4 服务器操作系统版本

在默认情况下,CentOS安装的Python版本为2.7.5,如图1-5所示。

图1-5 服务器操作系统默认Python版本

下面就将该Python 2.7.5升级到Python 3.9.8,主要步骤如下。

(1)下载源码tar包。我们先从官网上下载Python 3.9.8的源码包,如图1-6所示,上传后进行离线安装。当然如果有外网,那直接通过wget命令即可下载。

图1-6 Python 3.9.8的源码包

(2)安装基础库。首先是需要在CentOS服务器上安装或更新一些基础库,例如gcc(提供源码编译环境)、zlib(提供多种压缩和解压缩的方式)、OpenSSL(一个强大的安全套接字层密码库,包括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议)。命令为yum install -y gcc zlib-devel zlib openssl-devel。其中,CentOS里使用yum作为包管理工具,-y选项表示不需要手动确认是否安装该指定包。

(3)解压离线上传的Python源码压缩包,命令为tar –xvzf Python-3.9.8.tar.gz。

(4)新建Python的安装目录,命令为mkdir /usr/local/Python-3.9.8。

(5)配置安装Python的安装目录和生成makefile文件。先进入解压Python后的目录,然后执行configure命令,进行源码安装路径的配置,命令为./configure --prefix=/usr/local/Python-3.9.8/。常见选项为--prefix,用于指定安装的路径;--enable-optimizations是优化选项,加上这个选项编译后,性能可以优化10%左右(建议不要加,原因下面会提到)。

通常,Python 3.9.8配置成功的界面如图1-7所示。

图1-7 Python 3.9.8配置成功的界面

提示

遇到错误:在配置的时候加了--enable-optimizations,结果编译安装的时候出现“Could not import runpy module”的安装错误。

报错原因:默认CentOS的gcc编译器的版本为4.8.5,该版本过低。

解决方法:

升级gcc到高版本,gcc 8.1.0已修复此问题,但此方法会有兼容性问题;

./configure参数中去掉-enable-optimizations,建议用此方法。

(6)开始源码编译和安装,命令为make或make install。如果前面配置错误,重新配置后,要先执行make clean命令,清除上次的make命令所产生的object文件(扩展名为“.o”的文件)及可执行文件。另外,此步骤可能会消耗一定的时间,只要不报错,我们耐心等待即可。

若安装成功,还需安装或更新pip和setuptools这两个基础库,本书中使用的pip和setuptools版本如图1-8所示,这都是比较新的版本,所以暂时不更新。

图1-8 pip和setuptools版本

大家若想更新到最新版本,可下载最新版本,再传入无网的服务器环境并解压,解压后进入setuptools或pip目录,执行python setup.py install命令,即可完成更新安装。

(7)最后,进入/usr/local/目录可以看到已经安装成功,Python的安装目录如图1-9所示。

图1-9 Python的安装目录

(8)为了在任何目录下输入python命令都能执行,还需要做个软连接。首先备份原来的Python 2.7.5的默认解释器,命令为mv /usr/bin/python /usr/bin/python2.7.5。然后把新版本的Python 3.9.8进行软连接,命令为ln -s /usr/local/Python-3.9.8/bin/python3.9 /usr/bin/python。

(9)验证是否生效。在任何目录下,输入python,如图1-10所示则表示验证成功。

图1-10 验证成功

(10)确保升级Python版本后无异常。在后续使用CentOS的过程中,我们通过yum命令安装一些其他软件库的时候,可能会报异常“yum异常:File "/usr/bin/yum", line 30”。为了解决该问题,需要用vi命令打开/usr/bin/yum和/usr/libexec/urlgrabber-ext-down这两个文件,将第一行“#!/usr/bin/python”改为“#!/usr/bin/python2.7.5”,即使用原来服务器默认的Python版本。

yum

yum是基于Python编写的,采用Python作为命令解释器,这可以从/usr/bin/yum文件中第一行“#!/usr/bin/python”发现。而Python版本之间兼容性不太好,使得2.X版本与3.X版本之间存在语法不一致问题。CentOS 7自带的yum采用的是Python 2.7.5,因此当系统将Python升级到3.9.8版本后,会出现语法解释错误。

至此,我们完成了Python 3.9.8的离线方式的源码编译安装,大家可以根据自己需求选择任何Python版本进行安装。

1.2.2 Python运行

通常运行Python代码有两种方式,分别是交互式解释器和脚本文件。

交互式解释器。在命令行窗口直接运行Python即可进入Python的交互式解释器。我们在上面编写代码后直接运行,即可看到结果。这种方式一般用于简单的脚本调试或验证。

脚本文件。在命令行窗口运行python script-file.py即可运行Python脚本文件。通常用于运行较为复杂的代码内容。另外,使用脚本的方式运行代码通常要注意:在脚本文件头明确指定Python解释器和编码方式。

1.3 pip管理工具包

Python之所以受欢迎不仅是因为它简单易学,更重要的是它有非常多的宝藏工具。我们只要安装就能在Python里使用这些工具。它们可以处理各式各样的问题,无须我们再造轮子,而且随着社区的不断更新维护,有些工具越来越强大,几乎能媲美企业级应用。

那么这些第三方工具如何下载安装呢?它们被放在一个统一的仓库——PyPI(Python Package Index)中。有了仓库,我们还需要有类似管理员的角色,pip就是这样一个角色。pip把工具包从PyPI中取出来,然后安装到我们使用的Python中,pip还可以管理安装完成的工具,实现更新、查看、搜索、卸载等操作。

1.3.1 pip命令

pip(package installer for python)是Python包管理工具。pip可以对Python的第三方工具进行安装、更新、卸载等操作,十分方便。

其实pip是一个命令行程序,所以pip一般都在命令行中执行各种操作。pip命令组合比较灵活,下面重点介绍几个常用的。

(1)install。安装命令为pip install <包名> 或 pip install -r requirements.txt(requirements.txt里面包含待安装的包信息)。唯一需要特殊说明的是,安装时可以指定版本号来安装,例如:

pip install SomePackage              # 最新版本
pip install SomePackage==1.0.4       # 指定版本
pip install 'SomePackage>=1.0.4'     # 最小版本

(2)uninstall。卸载安装包命令为pip uninstall <包名>或pip uninstall -r requirements.txt。

(3)升级包。命令为pip install -U <包名>或pip install <包名> --upgrade。

(4)freeze。命令pip freeze用于查看已经安装的包及其版本信息,并支持导出到指定文件中,例如pip freeze > requirements.txt。

(5)list。命令pip list用于列出当前已经安装的包。使用命令pip list -o可以查询可升级的包。

(6)show。命令为pip show <包名>,用于显示包所在目录及信息。

更多pip的命令行指令大家可以通过命令pip man进行查看。

1.3.2 离线安装

通常第三方工具的在线安装的方式比较简单,直接采用我们在1.3.1节介绍的pip命令即可。而很多时候,我们在开发过程中用自己的计算机安装了很多第三方工具,开发完成则需要部署到客户的环境中。若此时客户的环境不能联网,那么我们就需要采用离线的方式进行第三方工具的安装。

第三方工具的离线安装的大致思路如下。

(1)从可以联网的计算机上导出项目工程依赖的第三方工具的名称到1个空文件中。

(2)下载指定的第三方工具安装包到指定文件夹。

(3)将第三方工具名称文件和安装包拷贝到离线环境进行安装。

具体操作步骤如下。

(1)本地导出项目的第三方工具名称。进入本地项目,使用pip freeze > requirements.txt,导出相关第三方工具名称。

(2)下载第三方工具到本地。将工具的安装包下载到本地指定文件,下载安装包的命令如下:

pip download -d your_offline_packages <package_name> # 下载单个离线包
pip download -d your_offline_packages -r requirements.txt # 批量下载离线包

pip download是一个工具,可用于下载Python项目及其依赖项。执行pip download命令在Linux上下载一个项目,软件包将以.whl结尾,该软件包可以直接安装在Windows上,也可以安装在macOS上。wheel文件是工具的源文件,可以通过命令pip install×××××.whl直接安装。

(3)离线安装。上传本地下载完成的所有第三方工具的源文件和依赖包的文件到远端服务器,然后使用如下命令进行离线安装:

pip install --no-index --find-links=/your_offline_packages/ package_name #安装单个离线包
pip install --no-index --find-links=/your_offline_packages/ -r requirements.txt # 批量安装离线包

1.3.3 更换pip源

很多人抱怨pip安装第三方工具有时太慢了,那是pip源的问题。pip默认从PyPI中下载工具安装包,但PyPI服务器在国外,我们访问PyPI服务器速度会很慢。目前,国内提供了很多镜像源,用来替代PyPI默认的地址,像清华源、豆瓣源、阿里云源等,这些镜像源备份了PyPI里的数据。这些镜像源的服务器在国内,所以我们的访问速度会快很多。通常有如下两种方式更换pip安装源。

方式一:临时替换。参数-i用于指定下载源,如pip install -i https://pypi.tuna.tsinghua.edu.cn/simple cogdl。

方式二:永远生效。在Linux下,修改~/.pip/pip.conf文件,若没有该文件就创建一个文件夹和文件,文件夹名称要加“.”,表示该文件夹是隐藏文件夹。修改内容如下,我们可以把index-url替换为自己想要修改的国内pip源地址。

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com

1.4 Python虚拟环境

Python之所以强大,除了其本身的特性强大,更重要的是Python拥有非常多的第三方工具。强大的软件库,让开发人员将精力集中在业务上,从而避免重复“造轮子”的浪费。但众多的软件库形成了复杂的依赖关系,加上Python 2和Python 3两个大版本的兼容性问题,这些对管理项目依赖造成了不少困扰。

在使用Python时,我们可以通过pip来安装第三方工具,但是由于pip的特性,系统中只能安装每个第三方工具的一个版本。但是在实际项目开发时,不同项目可能需要第三方工具的不同版本,这迫使我们需要根据实际需求不断进行更新或卸载相应的第三方工具。而如果我们直接使用本地的Python环境,会导致整体的开发环境相当混乱而不易管理,这时候我们就需要开辟一个独立干净的空间进行开发和部署。

在创建新项目时创建一个虚拟环境,这样做的好处是把项目环境和操作系统环境分开,避免影响操作系统环境。如果不创建虚拟环境,一股脑地使用pip install安装包,那么安装的包会统一放到操作系统的Python解释器目录的site-packages文件夹下,每新建一个项目,操作系统会自动把site-packages下的所有包都导入,这会使版本管理混乱。

接下来,我们将逐一阐述Python的基本概念、pipenv特性、pipenv安装、创建虚拟环境、pipenv管理依赖、pipenv安装依赖工具包、常用命令、部署迁移虚拟环境共8块内容。

1.4.1 基本概念

我们先解释几个Python中常用的基本概念,方便大家理解后续的内容。

Python版本。Python版本指的是Python解析器本身的版本。由于Python 3不能与Python 2兼容,两大“阵营”之争持续了很长时间,因此一些软件库需要适配两种版本的Python。同时,开发人员可能需要在一个环境中,部署不同版本的Python,对开发和维护造成了麻烦。

Python包库。包库或者软件源是Python第三方工具包的集合,可以发布、下载和管理软件包,其中pip一般是从PyPI官网上查找、下载工具安装包的。为了提高下载速度,世界上有很多PyPI的镜像服务器,在国内也有多个软件源。

虚拟环境。虚拟环境并不是什么新技术,它主要利用操作系统中环境变量和进程间环境隔离的特性,Python的虚拟环境就是利用这个特性构建的。在激活虚拟环境时,激活脚本会将操作系统的环境变量PATH修改为当前虚拟环境的路径,这样后续执行命令时就会在虚拟环境的路径中查找,从而避免了在原本路径查找,从而实现了Python环境的隔离。

第一次安装Python后,我们就有了一个全局级别的,或者系统级别的环境。我们可以使用虚拟环境工具在全局环境的基础上创建多个相互独立、互不影响的虚拟环境,在这些虚拟环境中可以安装不同版本的包库。从本质上来说,虚拟环境就是相互独立的文件夹,内含Python解释器和相关依赖。

使用虚拟环境的好处显而易见:

保持全局环境的干净;

指定不同的依赖版本;

方便记录和管理依赖。

1.4.2 pipenv特性

常见的虚拟环境管理工具有virtualenv、virtualenvwrapper、pipenv、conda等,本节将重点讲解pipenv这个工具。

pipenv类似virtualenv,它是一种Python包管理工具,能自动处理各种工具之间的依赖关系,也能解决不同项目对于同一个工具有不同版本需求,而产生的同工具不同版本冲突的问题。pipenv就是pip和virtualenv的结合体,它的出现解决了原有的pip、virtualenv、requirements.txt的工作方式的局限和弊端,能够更有效地管理Python的多个环境、各种第三方工具。pipenv能解决的问题如下。

requirements.txt依赖管理的局限。使用requirements.txt管理依赖的时候可能会出现版本不确定的构建问题。

多个项目依赖不同版本第三方工具的问题。例如,应用程序A需要特定模块的1.0版本但应用程序B需要该模块的2.0版本,当我们在A和B应用程序间切换时,需要不断检测、卸载、安装该模块。这意味着只安装一个版本的模块可能无法满足每个应用程序的要求,因此需要创建虚拟环境来将A、B应用程序所需的第三方工具包分隔开来。

pipenv很好地解决了上述的两大问题,因此具备如下特性,

pipenv集成了pip、virtualenv两者的功能且完善了两者的一些缺陷。pipenv使用Pipfile和Pipfile.lock,这使得对工具包的管理更为明确。

pipenv让使用者可以深入地了解第三方工具包的依赖关系图。我们使用命令pipenv graph即可查看第三方工具包的依赖关系图。

1.4.3 pipenv安装

pipenv的安装依赖于pip,如果没有配置和安装好pip,需要先安装pip。如果系统中是Python 3,那么可以直接使用pip3进行安装。pipenv安装过程如图1-11所示。命令为pip3 install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple/,其中,-i表示采用指定的地址进行下载安装。

图1-11 pipenv安装过程

pipenv安装完成后如图1-12所示,在pip相同的目录下会生成pipenv工具的相关文件。

图1-12 pipenv安装成功

1.4.4 创建虚拟环境

接下来,通过如下命令创建一个在指定目录下的全新虚拟环境。

(1)创建目录demo的命令为mkdir demo。

(2)进入目录demo的命令为cd demo。

(3)指定使用Python 3.9.8创建虚拟环境,否则为本地默认版本,命令为pipenv install--python/ usr/local/Python-3.9.8/bin/python3。

pipenv创建虚拟环境成功如图1-13所示。

图1-13 pipenv创建虚拟环境成功

安装完成后会在项目目录demo下自动生成Pipfile和Pipfile.lock两个文件,目录demo下的文件如图1-14所示,虚拟环境就是通过这两个文件进行管理依赖的。

图1-14 目录demo下的文件

1.4.5 pipenv管理依赖

pipenv使用Pipfile代替requirement.txt文件来记录Python第三方工具的信息,另外增加Pipfile.lock文件来锁定Python第三方工具的包名、版本和依赖关系的列表。

项目提交时,可将Pipfile文件和Pipfile.lock文件提交,待其他开发人员下载,根据此Pipfile文件,执行命令pipenv install来生成自己的虚拟环境。而Pipfile.lock文件用于保证包的完整性。

1.Pipfile文件

每次创建环境在当前目录下都会生成一个名为Pipfile文件,用来记录刚创建的环境信息。如果在当前目录下存在之前的Pipfile文件,新的Pipfile文件会将其覆盖。

Pipfile文件主要用来配置项目依赖的第三方工具、工具包的镜像源、Python解释器的版本等,该文件的示例如下:

# 主要用来配置包的下载网址
[[source]]
# 指定包的安装镜像源,一般使用国内的镜像来加快下载速度
url = "https://mirrors.aliyun.com/pypi/simple/"
verify_ssl = true
name = "pypi"
# 项目运行所需要依赖的第三方工具,即下载安装的工具包
[packages]
flask-authz ==='2.4.0'
# * 表示安装最新稳定版本
flask = '*'
# 开发依赖的工具包
[dev-packages] 
# 开发环境需要的包,不常用
# Python 解释器配置
[requires]
# 指定Python解释器的版本
python_version = "3.9"

2.Pipfile.lock文件

Pipfile.lock文件是通过哈希算法将包的名称、版本和依赖关系生成哈希值,可以保证包的完整性,锁定Python版本,便于以后项目发布使用固定的包。

在正常情况下,Pipfile.lock文件不会自动更新工具的版本,例如安装的requests库一开始是2.26.0版本,后来指定安装2.25.1版本,那么Pipfile文件会更新,但是Pipfile.lock文件不会更新,只有手动执行pipenv lock命令后才会更新。

Pipfile.lock文件保存了包的哈希值,这是确保生产环境和开发环境包信息一致的关键。当我们把项目从开发环境复制到生产环境,我们只需要执行pipenv install,而无须重新安装之前在开发环境中安装的包,这很省心。

1.4.6 pipenv安装依赖工具包

接下来,我们用pipenv安装requests库试一下,命令为pipenv install requests。pipenv安装依赖工具包成功如图1-15所示。

图1-15 pipenv安装依赖工具包成功

另外,pipenv install提供了--dev参数,用于区分需要部署到线上的开发包和只需要在测试环境中执行的包,这样就能明确不需要部署在线上的包,尽可能保证包干净。

提示

第一次安装包会比较慢,因为安装过程包含创建虚拟环境的过程。另外,如果使用默认安装源,大多数情况下会卡在锁定阶段,一般解决办法有两个。

(1)更改安装源,修改项目目录下的Pipfile文件中url后边的内容。pipenv本身就是基于pip的,所以也可以更换安装源。例如下面的Pipfile文件中使用阿里云提供的安装源:

[[source]]
url = "https://mirrors.aliyun.com/pypi/simple"
verify_ssl = true
name = "pypi"

(2)使用--skip-lock参数跳过锁定过程,锁定过程会比较费时,可以等真正完成项目开发要提交到仓库时再去锁定。

1.4.7 常用命令

一般通过命令pipenv -h可以看到pipenv的命令参数和命令示例,如图1-16和图1-17所示。

图1-16 pipenv的命令参数

图1-17 pipenv的命令示例

pipenv具体的使用方法为pipenv [OPTIONS] COMMAND [ARGS]...。其中,OPTIONS(操作参数)如表1-2所示。

表1-2 OPTIONS(操作参数)

操作参数

描述

--where

显示项目文件所在路径

--venv

显示虚拟环境下实际文件所在路径

--py

显示虚拟环境下Python解释器所在路径

--envs

显示虚拟环境的选项变量

--rm

删除虚拟环境

--man

显示帮助页面

--three / --two

使用Python 3或Python 2创建虚拟环境

--site-packages

附带安装原Python解释器中的第三方工具包

--version

显示版本信息

-h, --help

显示帮助信息

pipenv可使用的命令如表1-3所示。

表1-3 pipenv可使用的命令

命令

描述

check

检查安全漏洞

graph

显示当前依赖关系图信息

install

安装虚拟环境或者第三方工具

lock

锁定并生成Pipfile.lock文件

open

在编辑器中查看一个工具

run

在虚拟环境中执行命令

shell

进入虚拟环境

uninstall

卸载一个工具

update

卸载当前所有的工具,并安装它们的最新版本

例如,进入(激活)虚拟环境,执行pipenv shell命令。虚拟环境创建好后,需要被激活才能在当前命令行中使用,可以理解为将当前命令行环境中PATH变量的值替换。此时pipenv会启动一个激活虚拟环境的子shell,然后我们会发现命令行提示符前添加了虚拟环境名,虚拟环境名为项目名。激活虚拟环境示例如图1-18所示。

图1-18 激活虚拟环境示例

在虚拟环境下,执行exit命令即可退出虚拟环境。所以,若要在虚拟环境中执行Python脚本,有如下两种方式。

第一种是直接执行命令pipenv run python test.py。

第二种是先激活虚拟环境,然后再运行脚本,命令如下:

pipenv shell
python test.py

提示

不要使用命令pip install。虽然在虚拟环境中也会安装对应的包,但是不会更新Pipfile文件和Pipfile.lock文件,不便于后续的环境迁移。

pipenv --rm只是把创建的虚拟环境删除了,但Pipfile文件和Pipfile.lock文件还存在。下次如果想要创建与项目名相同的虚拟环境,只要切换到原项目目录下执行命令pip install即可。

1.4.8 部署迁移虚拟环境

一般一个项目会创建一个目录,由于Python项目不需要编译,开发完成后,将项目目录拷贝到服务器上就可以完成部署了。但是,在项目开发过程中,我们会陆续安装和部署一些依赖工具,保证项目运行,要记住安装了哪些依赖不是件轻松的事。

1.以前的部署流程

使用pip提供的导出依赖工具名的功能,将环境中项目依赖的第三方工具名导出并导入requirements.txt文件。命令为pip freeze > requirements.txt。然后,上传到服务器,在服务器上依据requirements.txt文件安装工具包,命令为pip install -r requirements.txt。

值得注意的是,pip freeze命令并不是针对特定项目的,该命令导出的是所在Python环境中的所有第三方工具。如果一个Python环境中,创建了两个不同的项目,各自有不同的依赖,那么导出的依赖会是两个项目依赖的并集,虽然这对部署来说没有问题,但安装没必要的依赖不算是好事,后续可能出现包冲突的问题。

因此,在创建项目时,为其创建一个独立的Python虚拟环境是个好的编程习惯。

2.现在的部署流程

我们通过pipenv使用虚拟环境管理项目依赖,在开发环境完成开发后,如何构建生产环境呢?这时候需要使用Pipfile.lock文件。我们执行命令pipenv lock,把当前环境的模块锁定,执行命令后它会更新Pipfile.lock文件,该文件是用于生产环境的。然后,我们只需要把代码、Pipfile文件和Pipfile.lock文件放到生产环境,执行命令pipenv install,就可以创建和开发环境一样的环境了。Pipfile.lock文件记录了所有包和子包的明确版本,以完成确定的构建。如果要在另一个开发环境开发,则将代码和Pipfile文件复制过去,执行命令pipenv install --dev,将会安装包括dev对应的开发环境中的包。

我们之所以要在开发时养成创建和使用虚拟环境的好习惯,除了避免未来工具之间的冲突,还有一个重要的原因是方便部署迁移。因为虚拟环境是独立的,仅包含项目相关的依赖,所以部署的效率更高,风险更小。

requirements.txt文件的兼容

pipenv可以像virtualenv一样用命令生成requirements.txt文件。

# 将Pipfile文件和Pipfile.lock文件里面的工具名导出到requirements.txt文件
pipenv lock -r  > requirements.txt
# 通过requirements.txt文件进行安装
pipenv install -r requirements.txt

如果老项目一开始没有使用pipenv进行依赖管理,那么因为requirements.txt文件的完全兼容的特性,我们可以重新通过pipenv来管理项目依赖,只需要pipenv读取原有的最新的requirements.txt并重新生成依赖到Pipfile文件中即可。

1.5 本章小结

通过学习本章的内容,相信大家能够掌握Python的各个版本的安装方法、第三方工具包的管理,以及虚拟环境的创建使用,可以为后续的项目测试开发构建一个干净、纯粹的Python环境。

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e61293”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程