Crontab | 缺少Python模块
我刚接触Unix和crontab,遇到的最大问题就是怎么让终端找到我想运行的Python模块。通过命令行可以正常运行这个程序,但在crontab中却不行。
我设置的第一个定时任务会给我发一封邮件,告诉我这个任务正在运行。第二个任务(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 个回答
0
*/1 * * * * pip install beatbox && python /Users/JohnDoe/Desktop/createUpdate.py
我花了很长时间才找到一个有效的解决方案,最后得到了这个。
0
你其实不需要去设置PYTHONPATH。如果你全局安装了beatbox,那么你可以在调用Python的同一行命令中直接包含环境设置,像这样:
*/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/
2
在你的定时任务设置中使用
*/1 * * * * PYTHONPATH=/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages python /Users/JohnDoe/Desktop/createUpdate.py
。不要加分号,PYTHONPATH
只对那次运行的 python
和你的脚本有效。
(另外,我觉得你出现
/bin/sh: PYTHONPATH: command not found
错误是因为 PYTHONPATH
和等号之间有一个空格。)
14
正确的方法是:
*/1 * * * * PYTHONPATH=/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages python /Users/JohnDoe/Desktop/createUpdate.py
请注意变量赋值时的空格。这里不需要分号,也不需要导出变量,因为在命令之前声明它们就已经让这些变量对命令有效了。