#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