如何实现执行导入模块的Python的crontab

时间:2016-07-04 18:00:57

标签: python python-2.7 cron pip crontab

所以我有一个从终端/命令行运行得很好的Python文件。 Python文件使用使用pip导入的模块。我已经将我的crontab文件设置为每个工作日的下午1:15运行:

/var/mail/

我的问题是双重的。首先,python文件的输出被发送到/var/mail/,而不是像从命令行正常运行时那样输出到终端屏幕。如何直接在终端中输出输出而不是附加到文件?其次,在ImportError文件中,脚本的输出是 return $resource('/api/core/blablah', {}, { getTranslated: { method: 'GET', isArray: true, transformResponse: function (data) { //do something here return 'something'; } } } }); ,表示没有模块具有我要导入的模块的名称。直接从命令行运行脚本时不会发生这种情况,在这种情况下,脚本可以正常运行而不会出现错误。我怎么能绕过这个?

1 个答案:

答案 0 :(得分:1)

不是故意的,但你的问题是单一的:你不理解Cron

Cron是一种调度工具。这是告诉你的电脑“嘿,经常照顾这个,好吗?”这是一个自动化流程,在设置后不会与您进行交互。系统管理员最常使用它来处理移动日志或复制磁盘等任务 - 管理员不希望看到的内容。 Cron作业输出到某个日志文件而不是控制台。 (当Cron 接收到stdout的输出时,它会保存输出并通过系统指定的邮件代理将其邮寄给您。这涉及将数据存储在/var/mail/为你发现了。)

这意味着您无法从Cron运行的作业输出到您的终端(没有对tty设备的某些操作,我将说这不是您想要的路线)。我不确定在什么情况下您可能希望每天下午1:15重复自动作业并将其输出重定向到您的终端。如果你关闭终端怎么办?工作在哪里发送输出?您需要实现日志记录。查看Python的logging模块。

至于ImportError:Cron不在你的shell中运行。它不使用您的环境变量或$PATH。那么这是什么意思?那么你的工作从python开始。哪个python/usr/bin/python/usr/local/bin/python/usr/local/bin/python3?使用哪种二进制文件取决于您的操作系统和设置,但无论如何,可以安全地说,当您的 Python具有模块时,默认 Python可执行文件不会。要解决这个问题,您应该使用绝对路径,例如将python替换为/usr/bin/python或其他。要找出您使用的Python,请在命令行上执行which python,输出将告诉您。