Python脚本在cron中无法正常执行

时间:2016-02-05 10:42:29

标签: python mysql cron

我遇到了python脚本的问题,我试图在cron中自动化。我相信问题是在通过cron运行脚本时没有导入mysql模块。

我在网上尝试了不同的解决方案,但似乎没有一种解决方案。

顺便说一句,在终端

中执行时脚本运行正常

这是我的crontab:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$HOME/bin
PYTHONPATH=/usr/lib/python2.7/site-packages
#MAILTO=root
# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * /usr/bin/python /var/www/html/testlist.py > /var/log/test.log 2>&1

这是test.log

中生成的错误
Traceback (most recent call last):
File "/var/www/html/testlist.py", line 106, in <module>
if  __name__ =='__main__':main()
File "/var/www/html/testlist.py", line 104, in main
get_ec2_instances('us-west-1')
File "/var/www/html/testlist.py", line 90, in get_ec2_instances
insert_metric(d[u'Timestamp'],d[u'Average'],d[u'Unit'])
File "/var/www/html/testlist.py", line 49, in insert_metric
cursor.close()
UnboundLocalError: local variable 'cursor' referenced before assignment

以下是导致错误的脚本部分:

#!/usr/bin/python
import argparse
import boto.ec2
import boto.ec2.cloudwatch
import datetime
import json
import ast
import sys
sys.path.append('/usr/lib/python2.7/site-packages')
from mysql.connector import MySQLConnection, Error
from mysql_connect import read_db_config

def insert_metric(timestamp,average,unit):
    print "Inserting now"
    query = "INSERT INTO metrics_tbl(timestamp,average,unit) " \
            "VALUES(%s,%s,%s)"
    args = (timestamp,average,unit)

    try:
        db_config = read_db_config()
        conn = MySQLConnection(**db_config)
        cursor = conn.cursor()
        cursor.execute(query, args)

        if cursor.lastrowid:
            print('last insert id', cursor.lastrowid)
        else:
            print('last insert id not found')

        conn.commit()
    except Error as error:
        print(error)

    finally:
        cursor.close()
        conn.close()

由于

1 个答案:

答案 0 :(得分:1)

你读过追溯吗?问题非常明确:在finally子句中,您尝试访问名称cursor,但尚未定义。

查看您的代码:您在cursor块的第三行定义try - 因此,在您的代码到达该点之前,名称cursor不存在。现在,如果两个第一个语句中的一个引发异常,那么您最终会进入finally块,在那里您尝试访问cursor ...

try:
     db_config = read_db_config()
     conn = MySQLConnection(**db_config)
     cursor = conn.cursor()
     cursor.execute(query, args)

     if cursor.lastrowid:
         print('last insert id', cursor.lastrowid)
     else:
         print('last insert id not found')

     conn.commit()
 except Error as error:
     print(error)

 finally:
     cursor.close()
     conn.close()

要解决此(第一个)问题,您需要在try块之前使用较窄的try块和/或定义cursor(和conn)。

首先,从try块中提取对read_db_config的调用 - 这里不需要它。如果失败了,你还是会有一个追溯......然后在try块之前定义conncursorNone,这样你就没有NameError了finally块,并在finally块中测试cursorconn是否已在关闭之前打开。此外,您的except子句无用 - 它会阻止您获得完整的回溯(这对于调试来说非常有用),因此只需删除它并让异常传播:

conn = None
cursor = None
db_config = read_db_config()

try:
     conn = MySQLConnection(**db_config)
     cursor = conn.cursor()
     cursor.execute(query, args)
     if cursor.lastrowid:
         print('last insert id', cursor.lastrowid)
     else:
         print('last insert id not found')
     conn.commit()
finally:
    if cursor is not None:
        cursor.close()
    if conn is not None:
        conn.close()

现在你可以再次运行你的代码,这一次找出真正的问题(这显然与导入MySQLdb无关 - 否则你从一开始就得到一个ImportError而你的代码就不会甚至被称为。)