Не удается импортировать модуль Python MySQL при запуске скрипта с использованием crontab

#python #shell #cron #mysql-python

#python #оболочка #cron #mysql-python

Вопрос:

Я использую crontab для запуска скрипта python, для которого требуется модуль MySQLdb. Когда я запускаю этот скрипт из командной строки, все работает нормально. Однако попытка запустить его с помощью crontab вызывает эту ошибку.

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

Я выполнил поиск в Google и добавил это в начало своего скрипта #!/usr/bin/python . Однако это ничего не дало, и я все еще получаю ту же ошибку. Что я делаю не так?

Ответ №1:

Возможно, вы используете другой исполняемый файл 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/')
 

Комментарии:

1. большое вам спасибо! Как мне узнать, каков путь к MySQLdb path?

2. Сделайте это, как показывает unutbu. import модуль в вашем терминале, где он работает, и введите MySQLdb.__file__

3. Очень полезно, большое спасибо. В моем случае правильным решением было: старайтесь всегда использовать АБСОЛЮТНЫЙ ПУТЬ К ДВОИЧНОМУ файлу при создании cronjob. С уважением

Ответ №2:

Определите PYTHONPATH в верхней части вашей crontab. Определение всех этих переменных среды (ниже) может помочь вам избежать некоторых распространенных проблем 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 автоматически).

Комментарии:

1. большое вам спасибо! Как мне узнать, каков путь к MySQLdb path?

Ответ №3:

Определение PYTHONPATH внутри crontab сработало для меня, сначала я ввел crontab с помощью:

 sudo crontab -e
 

Затем я добавил путь к библиотекам в переменную PYTHONPATH. В моем случае это было так:

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

Чтобы найти путь к библиотеке, я сначала импортировал ее с помощью python, а затем использовал атрибут file.

 import library
library.__file__
 

Ответ №4:

Попробуй бежать

 sudo -H pip install MySQLdb
 

(обратите внимание на опцию -H). У меня это сработало с аналогичной проблемой с другим пакетом

Ответ №5:

Проблема в том, что этот модуль отсутствует в пути поиска модуля python пользователя crontab. Попробуйте посмотреть здесь: http://docs.python.org/tutorial/modules.html#the-module-search-path