Crontab | 缺失的Python模块

7

我对Unix和crontab非常陌生。唯一遇到的主要问题是如何将终端指向我尝试运行的特定程序所需的python模块。从命令行可以正常运行该程序,但在crontab中无法运行。

第一个cron作业会发送一封电子邮件告诉我cron作业正在运行。第二个(createUpdate)运行我构建的脚本,每分钟运行一次。

crontab -l返回:

*/1 * * * * python /Users/JohnDoe/Desktop/emailalert.py
*/1 * * * * PYTHONPATH =/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages; export PYTHONPATH; python /Users/JohnDoe/Desktop/createUpdate.py 

我是否正确地组织了PYTHONPATH?

在定时任务之前,我应该将其拆分吗?

'export PYTHONPATH'是必需的吗?

编辑 我忘记添加错误信息了。

/bin/sh: PYTHONPATH: command not found
Traceback (most recent call last):
  File "/Users/JohnDoe/Desktop/createUpdate.py", line 1, in <module>
    import beatbox
ImportError: No module named beatbox
4个回答

14

正确的方法应该是

*/1 * * * * PYTHONPATH=/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages python /Users/JohnDoe/Desktop/createUpdate.py
请注意变量赋值时空格的使用。不需要分号,也无需导出变量,因为在命令之前声明它们已经使其在命令本身中生效。

2
当我使用sudo crontab时,一些Python模块丢失了。通过在PYTHONPATH中显示指向“site-packages”目录的路径解决了问题。以防万一有人遇到类似的问题。 - SpiralDev

2

使用

*/1 * * * * PYTHONPATH=/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages python /Users/JohnDoe/Desktop/createUpdate.py 

在你的crontab中,不要使用分号,PYTHONPATH 只适用于该实例的 python 和你的脚本。

此外,我认为你在

处出现了错误。
/bin/sh: PYTHONPATH: command not found

错误是因为在等号和PYTHONPATH之间有空格。

0

你不需要导出PYTHONPATH。如果你全局安装了beatbox,你应该可以在同一行(同一命令)中包含环境设置,就像这样:

*/1 * * * * PYTHONPATH=/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages python /Users/JohnDoe/Desktop/createUpdate.py 

此外,请确保变量名称、等号和变量值之间没有空格。
你应该使用virtualenv来创建一个隔离的Python环境,这样你就不必全局安装外部库。如果你安装了virtualenv并将依赖项安装到其中,那么你就可以像这样做:
*/1 * * * * /path/to/virtual/env/bin/python /Users/JohnDoe/Desktop/createUpdate.py

而不必担心全局依赖关系。

这里是virtualenv的文档:http://www.virtualenv.org/en/latest/


0
*/1 * * * * pip install beatbox && python /Users/JohnDoe/Desktop/createUpdate.py 

我曾经费尽心思寻找可行的解决方案,最终得出了这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接