2011-11-01 130 views
6

我正在使用crontab運行需要模塊MySQLdb的python腳本。當我從命令行運行這個腳本時,一切正常。但是,嘗試使用crontab運行它會引發此錯誤。使用crontab運行腳本時無法導入Python MySQL模塊

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

我做了谷歌搜索,並將此給我的腳本#!/usr/bin/python的頂部。但是,這並沒有做任何事情,我仍然得到同樣的錯誤。我究竟做錯了什麼?

回答

12

這可能是你正在使用不同的Python可執行文件。在shell中,輸入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路徑的路徑是什麼? – Spencer

+1

像unutbu表演一樣。在你的終端裏輸入''import module'然後輸入'MySQLdb .__ file__' –

+0

非常有用,非常感謝。在我的情況下,正確的解決方案是:嘗試創建cronjob時始終使用ABSOLUTE PATH TO BINARY。問候 –

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殼和類型:

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

您的路徑我的不同。在上面的例子中,添加到PYTHONPATH的合適目錄應該是/usr/lib/pymodules/python2.7(儘管您不必添加此特定路徑,因爲您的python可執行文件應該自動在其sys.path中包含此路徑)。

+0

非常感謝!我如何知道MySQLdb路徑的路徑是什麼? – Spencer

2

定義裏面的crontab的PYTHONPATH工作對我來說,首先,我用crontab中輸入:

sudo crontab -e 

我加入庫路徑PYTHONPATH變量。在我的情況是這樣的:

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

要找到我第一個導入它使用python,然後使用文件屬性庫的路徑。

import library 
library.__file__