在使用crontab运行脚本时无法导入Python MySQL模块
我正在使用crontab来运行一个需要MySQLdb模块的Python脚本。当我从命令行运行这个脚本时,一切都正常。但是,当我通过crontab来运行它时,却出现了这个错误。
Traceback (most recent call last):
File "clickout.py", line 3, in <module>
import MySQLdb
ImportError: No module named MySQLdb
我在网上搜索了一下,然后在我的脚本顶部加上了这行代码#!/usr/bin/python
。可是,这并没有解决问题,我还是遇到了同样的错误。我到底哪里做错了呢?
5 个回答
在crontab里定义PYTHONPATH对我来说有效。首先,我通过以下命令进入了crontab:
sudo crontab -e
然后,我把库的路径添加到了PYTHONPATH这个变量里。对我来说,这个路径是:
PYTHONPATH=/home/username/.local/lib/python2.7/site-packages
为了找到库的路径,我先用python导入了这个库,然后使用了file属性。
import library
library.__file__
在你的 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 中)。
可能你正在使用不同的Python执行程序。在命令行中输入 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/')