No se puede importar el módulo MySQL de Python cuando se ejecuta un script usando crontab

Estoy usando crontab para ejecutar un script de Python que requiere el módulo MySQLdb. Cuando ejecuto este script desde la línea de comandos, todo funciona bien. Sin embargo, tratar de ejecutarlo usando crontab provoca este error.

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

Hice una búsqueda en Google y agregué esto a la parte superior de mi script #!/usr/bin/python . Sin embargo, esto no hizo nada y todavía estoy recibiendo el mismo error. ¿Qué estoy haciendo mal?

Puede ser que estés usando un ejecutable de Python diferente. En el shell, ingrese which python para averiguar dónde se encuentra el ejecutable de Python. Digamos que esto devuelve algo distinto de /usr/bin/python , say /home/myuser/bin/python , luego en la primera línea de su script, escribiría:

 #!/home/myuser/bin/python 

También puede ser que su shell tenga una variable de entorno llamada PYTHONPATH . Si ese es el caso y encuentra de dónde está importando la biblioteca, así es como agregaría la ruta para encontrar la biblioteca en la primera línea de su script, antes de importar “MySQLdb”:

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

Define PYTHONPATH en la parte superior de tu crontab. La definición de todas estas variables de entorno (a continuación) puede ayudarlo a evitar algunos problemas comunes de cron relacionados con la falta de variables de entorno:

 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 

Para averiguar la ruta a MySQLdb, abra un shell de python y escriba:

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

Tu camino es diferente. En el ejemplo anterior, el directorio apropiado para agregar a PYTHONPATH sería /usr/lib/pymodules/python2.7 (aunque no debería tener que agregar esta ruta en particular, ya que su ejecutable python debería tener esta ruta en su sys.path automáticamente) .

Definiendo el PYTHONPATH dentro de crontab funcionó para mí, primero ingresé a crontab usando:

 sudo crontab -e 

Luego agregué la ruta de las bibliotecas a la variable PYTHONPATH. En mi caso fue este:

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

Para encontrar la ruta de la biblioteca, primero la importé con python y luego usé el atributo de archivo .

 import library library.__file__ 

Intenta correr

 sudo -H pip install MySQLdb 

(note la opción -H). Me funcionó con un problema similar con otro paquete.

El problema es que este módulo no se encuentra en la ruta de búsqueda del módulo python del usuario crontab. Intente buscar aquí: http://docs.python.org/tutorial/modules.html#the-module-search-path