使用crontab运行脚本时无法导入Python MySQL模块

问题描述 投票:8回答:5

我使用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的顶部。但是,这没有做任何事情,我仍然得到同样的错误。我究竟做错了什么?

python shell cron mysql-python
5个回答
13
投票

可能是您正在使用不同的Python可执行文件。在shell上,输入which python以找出Python可执行文件所在的位置。假设这会返回/usr/bin/python以外的其他内容,比如/home/myuser/bin/python,然后在脚本的第一行,你会写:

#!/home/myuser/bin/python

也可能是你的shell有一个名为PYTHONPATH的环境变量。如果是这种情况,并且您找到了从中导入库的位置,那么在导入“MySQLdb”之前,您将在脚本的第一行添加查找库的路径:

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

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 shell并输入:

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

你的道路我的不同。在上面的示例中,添加到PYTHONPATH的相应dir将是/usr/lib/pymodules/python2.7(尽管您不应该添加此特定路径,因为您的python可执行文件应该在其sys.path中自动具有此路径)。


3
投票

在crontab中定义PYTHONPATH对我有用,首先我使用以下命令进入crontab:

sudo crontab -e

然后我将库路径添加到PYTHONPATH变量。在我的情况下是这样的:

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

为了找到库的路径,我首先使用python导入它,然后使用file属性。

import library
library.__file__

0
投票

试试跑步

sudo -H pip install MySQLdb

(注意-H选项)。它对我来说与另一个包有类似的问题


-1
投票

问题是该模块不在crontab用户的python模块搜索路径中。试试这里:http://docs.python.org/tutorial/modules.html#the-module-search-path

© www.soinside.com 2019 - 2024. All rights reserved.