- 本书赞誉
- 前言
- 目标读者
- 不适合阅读本书的读者
- 本书结构
- 什么是数据处理
- 遇到困难怎么办
- 排版约定
- 使用代码示例
- 致谢
- 第 1 章 Python 简介
- 第 2 章 Python 基础
- 第 3 章 供机器读取的数据
- 第 4 章 处理 Excel 文件
- 第 5 章 处理 PDF 文件 以及用 Python 解决问题
- 第 6 章 数据获取与存储
- 第 7 章 数据清洗:研究、匹配与格式化
- 第 8 章 数据清洗:标准化和脚本化
- 第 9 章 数据探索和分析
- 第 10 章 展示数据
- 第 11 章 网页抓取:获取并存储网络数据
- 第 12 章 高级网页抓取:屏幕抓取器与爬虫
- 第 13 章 应用编程接口
- 第 14 章 自动化和规模化
- 第 15 章 结论
- 附录 A 编程语言对比
- 附录 B 初学者的 Python 学习资源
- 附录 C 学习命令行
- 附录 D 高级 Python 设置
- 附录 E Python 陷阱
- 附录 F IPython 指南
- 附录 G 使用亚马逊网络服务
- 关于作者
- 关于封面
14.6 简单的自动化
在 Python 中,简单的自动化很容易。如果你的代码不需要在多台机器上运行,如果你拥有一台服务器,或者你的任务不是事件驱动的(或者可以每天在相同时间执行),简单的自动化会很有效。开发的一个主要原则是选择最清晰和简单的方法。自动化也是如此!如果你可以轻松地使用一个定时任务(corn job)自动化工作,绝不要浪费时间过度工程化它,或者让它变得更加复杂。
在学习简单自动化的过程中,我们会介绍内置的 cron(一个基于 Unix 系统的任务管理器)和各种 Web 接口,让团队得以轻松访问所编写的脚本。这些代表着简单的自动化解决方案,不需要你的直接干预。
14.6.1 CronJobs
Cron(http://en.wikipedia.org/wiki/Cron)是一个基于 Unix 系统的任务调度工具,用来使用服务器日志和管理工具运行脚本。Cron 需要你确定任务执行的频率和时间。
如果你不能轻松地为脚本确定一个时间线,cron 可能不是一个好的选择。另外,你可以运行一个规律的 cron 任务来测试是否存在运行任务所必需的条件,然后使用一个数据库或本地文件通知运行的时间。在多个定时任务的帮助下,你可以检查文件或数据库,并且执行任务。
如果你之前从来没有使用过 cron 文件,它们非常直观。大多数的任务可以通过输入下面的指令来编辑:
crontab -e
取决于操作系统,如果之前从来没有编写过 cron 文件,你可能会收到提示,让你选择一个编辑器。你可以使用默认的配置,或者根据其他的偏好改变它。
你会在文件中看到一些文档和注释,解释 cron 文件是如何工作的。cron 文件中每一个不以 # 符号开头的行,都定义了一个 cron 任务。每一个 cron 任务都需要下面这个参数列表:
minute hour day_of_month month day_of_week usercommand
如果脚本需要在一天中的每个小时都执行,但是只在工作日执行,你需要写类似于下面的代码:
0 * * * 1-5 python run_this.py
这告诉 cron 在周一到周五的每个整点开始执行脚本。有很多好的入门教程(https://help.ubuntu.com/community/CronHowto)详细地讲解了哪些选项对你可用,但是下面有几条建议。
· 总是在所有代码行前添加 MAIL_TO=your@email.com 变量。通过这种方式,如果有哪个脚本失败了,cron 会给你发送邮件,报告异常,这样你会知道它不再工作了。你需要设置笔记本电脑、台式计算机或服务器来发送邮件。根据操作系统和互联网服务提供商的不同,你可能需要做一些设置。有一个很好的 GitHub gist(https://gist.github.com/kany/c44c077881047ead8faa)可以帮助 Mac 用户上手,还有一篇来自 HolaRails 的有用的面向 Ubuntu 用户的文章(https://holarails.wordpress.com/2013/11/17/configure-sendmail-in-ubuntu-12-04-and-make-it-fast/)。
· 如果所运行的服务当计算机重启时需要重新启动,使用 @reboot 特性。
· 如果必需运行一些路径环境或者其他的命令来恰当地执行脚本,你应该在仓库中编写一个 cron.sh 文件。将所有必需的命令整理到一个文件中,并且直接运行这个文件,而不是使用一个用 && 连接的很长的命令列表。
· 不要害怕去搜索答案。如果你是第一次使用 cron,并且遇到了问题,很有可能已经有人发布过解决方案,通过 Google 搜索就可以解决问题。
为了测试如何使用 cron,我们会创建一个简单的 Python 示例。从创建一个新的名为 hello_time.py 的 Python 文件开始,并且把这些代码放在文件里:
from datetime import datetime print 'Hello, it is now %s.' % datetime.now().strftime('%d-%m-%Y %H:%M:%S')
下面,在相同文件夹下创建一个简单的 cron.sh 文件,并且在里面编写下面的 bash 命令:
export ENV=PROD cd /home/your_home/folder_name python hello_time.py
我们不需要设置环境变量,因为并不经常使用它,并且你需要更新 cd 这行代码,让它正确地变成代码所在的文件夹(这是指向当前文件的路径)。无论如何,这是一个很好的实例,展示了如何使用 bash 命令设置变量,查看虚拟环境变量,复制和移动文件或改变目录到新的文件夹,然后调用 Python 文件。从本书的开始,你就在使用 bash 了,所以即使你仍然是初学者也不要害怕。
最后,让我们使用 crontab -e 创建 cron 任务。使用编辑器在文挡下方添加这些代码:
MAIL_TO=youremail@yourdomain.com */5 * * * * bash /home/your_home/folder_name/cron.sh > /var/log/my_cron.log 2>&1
你需要使用真实地址替换这个示例中编造的 Email 地址,编写到刚刚创建的 cron 文件的正确路径。记住,hello_time.py 脚本应该在相同的文件夹中。在这个例子里,我们还创建了一个 cron 使用的日志文件(/var/log/my_cron.log)。最后的语句 2>&1 告诉 cron 将输出和所有错误打印到日志文件中。一旦退出编辑器,并正确地保存了 cron 文件,你应该会看见一个信息,确认新 cron 任务已经安装。等待几分钟,然后检查日志文件。你应该会看到脚本输出的信息。如果没有的话,你可以通过在系统日志(通常为 /var/log/syslog)中搜索,或在 cron 日志(通常为 /var/log/cron)中搜索 cron 错误日志信息。为了删除这个 cron 任务,再一次编辑 crontab,删除这行代码或在这行代码的开头添加#,将它注释掉。
Cron 是自动化脚本和警报的非常简单的方式。它是在 20 世纪 70 年代中期最初的 Unix 系统的开发中,由贝尔实验室设计的非常强大的工具,直到今日,仍被广泛地使用。如果可以很简单地预测自动化程序运行时间,或者只需要几个 bash 命令就可以运行,cron 是一个自动化代码的有效方式。
如果你需要为 cron 任务传递命令行参数(见 14.5.1 节),那么文件中的代码可能类似下面这样。
*/20 10-22 * * * python my_arg_code.py arg1 arg2 arg3 0,30 10-22 * * * python my_arg_code.py arg4 arg5 arg6
Cron 是一个相当灵活也很简单的工具。如果它符合你的需要,那很棒!如果不符合,继续阅读来学习自动化数据处理的其他简单方式。
14.6.2 Web接口
如果你需要脚本、爬虫或者报告任务按需执行,一个简单的解决方案是直接构建一个 Web 接口,人们可以登录进去并点击按钮执行任务。Python 有很多不同的网络框架供你选择,所以使用哪一个框架以及花费多少时间在 Web 接口上完全取决于你。
一个简单的方式是使用 Flask-Admin(https://flask-admin.readthedocs.org/en/v1.0.9/),这是一个基于 Flask 网络框架(http://flask.pocoo.org/)构建的管理站点。Flask 是一个微框架,这意味着它并不需要太多的代码上手。在依照快速开始指引(http://flask.pocoo.org/docs/0.10/quickstart/)创建并运行了网站后,你只需要在 Flask 应用程序中创建一个视图来执行任务。
确保任务可以在完成时用其他的方式通知用户或你(邮件、通知等),因为它不太可能及时地完成并给出一个合适的 Web 响应。同样确保在任务开始时通知用户,这样他们不会发出一连串的让任务开始运行的请求。
另外一个流行并且经常使用的 Python 框架是 Bottle(http://bottlepy.org/docs/dev/index.html)。Bottle 的用法类似于 Flask,如果用户点击了按钮(或做了其他简单的操作),Bottle 用视图来执行任务。
Python 开发者使用的一个大型 Python 网络框架是 Django(https://www.djangoproject.com/)。Django 最初被开发用来使新闻编辑室可以更简单地发布内容,它拥有一个内置的认证和数据库系统,并使用配置文件配置大多数的特性。
无论你使用什么框架,或者如何创建视图,你会想要在一些地方挂载框架,这样其他人可以请求任务。你可以使用 DigitalOcean 或者亚马逊网络服务(查看附录 G)轻松挂载自己的站点。你同样可以使用支持 Python 环境的服务提供商,比如 Heroku(https://www.heroku.com/)。如果你对这些选择感兴趣,Kenneth Reitz 非常出色地介绍了如何使用 Heroku 部署 Python 应用(https://devcenter.heroku.com/articles/getting-started-with-python#introduction)。
无论使用什么框架或微框架,你都需要考虑认证和安全问题。无论使用什么 Web 服务器,你都可以在服务器端创建它,或者探索框架给你的一些选择(包括插件或者其他支持的特性)。
14.6.3 Jupyter notebook
第 10 章介绍了如何创建 Jupyter notebook,它是另外一种分享代码的好方式,特别是对于那些不需要了解 Python,但是需要查看图表或者其他脚本输出的人来说。如果你教他们如何使用简单的命令,例如运行 notebook 中所有的单元,并在下载新的报告后终止 notebook 服务,你会发现它会节省大量的时间。
添加 Markdown 单元来解释如何使用你的共享 notebook 是一种很好的方式,可以确保所有人明白如何使用代码,并且可以更容易地继续前进,而不需要你的帮助。
如果你的脚本功能组织得很好,不需要做什么修改,直接将仓库放到 Jupyter notebook 可以导入和使用代码的地方(设置的服务器或者 notebook 的 PYTHONPATH(http://stackoverflow.com/questions/3402168/permanently-add-a-directory-to-pythonpath)是个好主意,这样你正在使用的模块总是可用的)。通过这种方式,你可以导入那些 main 函数到 notebook 中,在有人点击 notebook 的“运行所有”按钮时,所有的脚本会运行并且生成报告。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论