返回介绍

14.6 简单的自动化

发布于 2024-01-27 21:43:11 字数 6501 浏览 0 评论 0 收藏 0

在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文