Crontab | 缺少Python模块

7 投票
4 回答
12987 浏览
提问于 2025-04-18 03:08

我刚接触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

请注意变量赋值时的空格。这里不需要分号,也不需要导出变量,因为在命令之前声明它们就已经让这些变量对命令有效了。

撰写回答