gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:51:27 25 4
gpt4 key购买 nike

我尝试在 cron 中自动化的 python 脚本有问题。我相信问题出在通过 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()

谢谢

最佳答案

你读过回溯了吗???问题很明显:在您的 finally 子句中,您试图访问尚未定义的名称 cursor

看看你的代码:你在 try block 的第三行定义了 cursor - 所以直到你的代码到达那一点,名称 cursor 不存在。现在,如果前两个语句中的一个引发异常,您最终会进入 finally block ,您将在其中尝试访问 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 block 和/或在 try block 之前定义 cursor(和 conn)。

首先,从 try block 中提取对 read_db_config 的调用 - 您在这里不需要它。如果它失败了,无论如何你都会有一个回溯......然后在 try block 之前将 conncursor 定义为 None 这样你就不会'在 finally block 中没有 NameError,并且在 finally block 中,在关闭它们之前测试 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 并且你的代码甚至不会被调用)。

关于Python 脚本无法在 cron 中正确执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com