2011-11-01 190 views
6

我正在使用crontab运行需要模块MySQLdb的python脚本。当我从命令行运行这个脚本时,一切正常。但是,尝试使用crontab运行它会引发此错误。使用crontab运行脚本时无法导入Python MySQL模块

Traceback (most recent call last): 
    File "clickout.py", line 3, in <module> 
    import MySQLdb 
ImportError: No module named MySQLdb 

我做了谷歌搜索,并将此给我的脚本#!/usr/bin/python的顶部。但是,这并没有做任何事情,我仍然得到同样的错误。我究竟做错了什么?

回答

12

这可能是你正在使用不同的Python可执行文件。在shell中,输入which python以找出Python可执行文件所在的位置。比方说,这将返回比/usr/bin/python以外的东西,说/home/myuser/bin/python,然后在你的脚本的第一行,你可以这样写:

#!/home/myuser/bin/python 

它也可能是您的外壳已经环境变量称为PYTHONPATH。如果是这样的话,你会发现在那里的,从导入库中,那么这就是你将如何添加路径找到你的脚本的第一行库,之前“MySQLdb的”进口:

import sys; sys.path.append('/path/to/MySQLdb-lib/') 
+1

非常感谢!我如何知道MySQLdb路径的路径是什么? – Spencer

+1

像unutbu表演一样。在你的终端里输入''import module'然后输入'MySQLdb .__ file__' –

+0

非常有用,非常感谢。在我的情况下,正确的解决方案是:尝试创建cronjob时始终使用ABSOLUTE PATH TO BINARY。问候 –

6

在crontab的顶部定义PYTHONPATH。 定义所有这些环境变量(见下文)可以帮助你避免与缺乏环境变量的一些常见的cron问题:

USER=... 
HOME=/home/... 
SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$HOME/bin 
PYTHONPATH=... 
DISPLAY=:0.0 
MAILTO=... 
LANG=en_US.UTF-8 

要找出路径MySQLdb的,开一个python壳和类型:

>>> import MySQLdb 
>>> MySQLdb.__file__ 
'/usr/lib/pymodules/python2.7/MySQLdb/__init__.pyc' 

您的路径我的不同。在上面的例子中,添加到PYTHONPATH的合适目录应该是/usr/lib/pymodules/python2.7(尽管您不必添加此特定路径,因为您的python可执行文件应该自动在其sys.path中包含此路径)。

+0

非常感谢!我如何知道MySQLdb路径的路径是什么? – Spencer

2

定义里面的crontab的PYTHONPATH工作对我来说,首先,我用crontab中输入:

sudo crontab -e 

我加入库路径PYTHONPATH变量。在我的情况是这样的:

PYTHONPATH=/home/username/.local/lib/python2.7/site-packages 

要找到我第一个导入它使用python,然后使用文件属性库的路径。

import library 
library.__file__