Найти - Пользователи
Полная версия: exception на пустом месте, откуда?
Начало » Python для новичков » exception на пустом месте, откуда?
1 2
o7412369815963
сделал колесо - скрипт шедуллер
вкратце:
def log(s):
dtime = time.strftime('%y/%m/%d(%w) %H:%M',time.localtime( time.time() ))
open('lsh.log','a').write('%s: %s\n' % (dtime,s))

def main():
while 1:
try:
time.sleep(3)
d = time.localtime( time.time() )
ds = time.strftime('%m/%d/%w %H:%M',d)
if ds==ds_old: continue
ds_old = ds
print ds

except Exception as e:
log('except main loop: %s' % (str(e),))
такой вот безобидный цикл несколько раз в день выбрасывает в exception:
10/02/11(4) 05:17: except main loop: [Errno 9] Bad file descriptor
весь исходник
# coding: utf-8

import time,re,os

# cron
# sec min hour day mon wday

jobs = []

def log(s):
dtime = time.strftime('%y/%m/%d(%w) %H:%M',time.localtime( time.time() ))
open('lsh.log','a').write('%s: %s\n' % (dtime,s))

def start(dtime,com):
log(com)
print 'start:',com
# ch dir
cur = os.getcwd()
path = com
f = path.rfind('\\')
if f>=0: path = path[:f]
try:
os.chdir(path)
# start
import subprocess
subprocess.Popen(com, shell = True)
os.chdir(cur)
except:
log('except %s' % (com,))

def loadjobs(fname='lsh.lsh'):
global jobs
for s in open(fname,'r').readlines():
s = s.rstrip()
if s and s[0]!='#':
f = s.find(':')
if f:
job = s[:f]
com = s[f+1:]
if job == 'import':
if fname!=com: loadjobs(com)
elif job == '@restart': start('start',com)
else: jobs.append([job,com])

def test(d,job):
#m = [d.tm_sec, d.tm_min, d.tm_hour, d.tm_mday, d.tm_mon, d.tm_wday]
m = [d.tm_min, d.tm_hour, d.tm_mday, d.tm_mon, d.tm_wday]
d = job.split(',')
if len(d)!=5:
print 'error in job time settings'
return 0

for n,j in enumerate(d):
min = m[n]
for t in j.split(' '):
# * /2 /1
if t=='*': continue
if (t=='/1') and (min%2 == 1): continue
if (t=='/2') and (min%2 == 0): continue
# int
r = re.match(r'^(\d+)$',t)
if r and int(r.groups(0)[0])==min: continue
# a-b
r = re.match(r'^(\d+)-(\d+)$',t)
if r and ( int(r.groups(0)[0]) <= min <= int(r.groups(0)[1]) ): continue
#
return 0
return 1

def main():
ds_old = ''
while 1:
try:
time.sleep(3)
d = time.localtime( time.time() )
ds = time.strftime('%m/%d/%w %H:%M',d)
if ds==ds_old: continue
ds_old = ds
print ds

for job in jobs:
if test(d,job[0]): start(ds,job[1])
except Exception as e:
log('except main loop: %s' % (str(e),))

log('start')
loadjobs() # загрузка данных
main() # основная программа
truporez
Файл лучше закрывать, а еще лучше использовать стандартный модуль logging.
o7412369815963
truporez
Файл лучше закрывать, а еще лучше использовать стандартный модуль logging.
по идее файл должен закрываться при входе из функции. переделал на logging, поглядим…
o7412369815963
не помогло:
2010-02-11 21:09:02,703 CRITICAL except main loop: [Errno 9] Bad file descriptor
кстате, это все под виндой

исходник:
# coding: utf-8

import logging
logging.basicConfig(filename='lsh.log',format='%(asctime)s %(levelname)s %(message)s',level=logging.DEBUG)

import time,re,os

jobs = []

def start(dtime,com):
logging.info(com)
print 'start:',com
# ch dir
cur = os.getcwd()
path = com
f = path.rfind('\\')
if f>=0: path = path[:f]
try:
os.chdir(path)
# start
import subprocess
subprocess.Popen(com, shell = True)
os.chdir(cur)
except Exception as e:
logging.error('except %s' % (str(e),))

def loadjobs(fname='lsh.lsh'):
global jobs
for s in open(fname,'r').readlines():
s = s.rstrip()
if s and s[0]!='#':
f = s.find(':')
if f:
job = s[:f]
com = s[f+1:]
if job == 'import':
if fname!=com: loadjobs(com)
elif job == '@restart': start('start',com)
else: jobs.append([job,com])

def test(d,job):
#m = [d.tm_sec, d.tm_min, d.tm_hour, d.tm_mday, d.tm_mon, d.tm_wday]
m = [d.tm_min, d.tm_hour, d.tm_mday, d.tm_mon, d.tm_wday]
d = job.split(',')
if len(d)!=5:
print 'error in job time settings'
return 0

for n,j in enumerate(d):
min = m[n]
for t in j.split(' '):
# * /2 /1
if t=='*': continue
if (t=='/1') and (min%2 == 1): continue
if (t=='/2') and (min%2 == 0): continue
# int
r = re.match(r'^(\d+)$',t)
if r and int(r.groups(0)[0])==min: continue
# a-b
r = re.match(r'^(\d+)-(\d+)$',t)
if r and ( int(r.groups(0)[0]) <= min <= int(r.groups(0)[1]) ): continue
#
return 0
return 1

def main():
ds_old = ''
while 1:
try:
time.sleep(3)
d = time.localtime( time.time() )
ds = time.strftime('%m/%d/%w %H:%M',d)
if ds==ds_old: continue
ds_old = ds
print ds

for job in jobs:
if test(d,job[0]): start(ds,job[1])
except Exception as e:
logging.critical('except main loop: %s' % (str(e),))

logging.info('start')
loadjobs()
main()
Lexander
Давайте пример файла lsh.lsh, чтобы хотя бы запустить скрипт.
o7412369815963
можно использовать пустой файл, а сейчас у меня вот этот:
#min,hour,day,month,wday:command
#*,*,*,*,*:/home/user;echo 'hello' >> 1.txt
#import:other.lsh
#/1,*,*,*,0-4:every two minutes for work day
@restart:C:\home\vampir\SWEB_history\trunk\w.py
@restart:C:\home\vampir\SWEB_history\trunk\DataEater.py
@restart:C:\home\vampir\SWEB_history\trunk\e_rpc_serv.py
0,8-20,*,*,*:..\nestle_log_transfer\nestle_trace.py
0,8,*,*,*:C:\home\lega\scripts\1c_referror.py
0,14,*,*,*:C:\home\lega\scripts\1c_referror.py
за ночь ещё 2 ексепта выскочило:
2010-02-12 02:02:02,365 CRITICAL except main loop: [Errno 9] Bad file descriptor
2010-02-12 06:55:02,563 CRITICAL except main loop: [Errno 9] Bad file descriptor
Lexander
Дайте полный лог, а не только ошибки.
Viper
Если использовать logging.exception вместо logging.critical будет больше информации по ошибке.
o7412369815963
Lexander
Дайте полный лог, а не только ошибки.
лог ни какой ясности не внесет, но вот…
2010-02-11 16:41:02,227 INFO start
2010-02-11 16:41:02,227 INFO C:\home\vampir\SWEB_history\trunk\w.py
2010-02-11 16:41:02,243 INFO C:\home\vampir\SWEB_history\trunk\DataEater.py
2010-02-11 16:41:02,259 INFO C:\home\vampir\SWEB_history\trunk\e_rpc_serv.py
2010-02-11 17:00:02,267 INFO ..\nestle_log_transfer\nestle_trace.py
2010-02-11 18:00:02,292 INFO ..\nestle_log_transfer\nestle_trace.py
2010-02-11 19:00:02,270 INFO ..\nestle_log_transfer\nestle_trace.py
2010-02-11 20:00:02,749 INFO ..\nestle_log_transfer\nestle_trace.py
2010-02-11 21:09:02,703 CRITICAL except main loop: [Errno 9] Bad file descriptor
2010-02-12 02:02:02,365 CRITICAL except main loop: [Errno 9] Bad file descriptor
2010-02-12 06:55:02,563 CRITICAL except main loop: [Errno 9] Bad file descriptor
2010-02-12 08:00:02,489 INFO ..\nestle_log_transfer\nestle_trace.py
2010-02-12 09:00:02,654 INFO ..\nestle_log_transfer\nestle_trace.py
2010-02-12 10:00:02,678 INFO ..\nestle_log_transfer\nestle_trace.py
2010-02-12 10:27:39,710 INFO start
2010-02-12 10:27:39,710 INFO C:\home\vampir\SWEB_history\trunk;w.py
2010-02-12 10:27:39,726 INFO C:\home\vampir\SWEB_history\trunk;DataEater.py
2010-02-12 10:27:39,740 INFO C:\home\vampir\SWEB_history\trunk;e_rpc_serv.py
2010-02-12 11:00:00,720 INFO ..\nestle_log_transfer;nestle_trace.py
2010-02-12 12:00:00,713 INFO ..\nestle_log_transfer;nestle_trace.py
2010-02-12 13:00:00,799 INFO ..\nestle_log_transfer;nestle_trace.py
2010-02-12 13:56:44,640 INFO start
2010-02-12 13:56:44,640 INFO C:\home\vampir\SWEB_history\trunk;w.py
2010-02-12 13:56:44,640 INFO C:\home\vampir\SWEB_history\trunk;DataEater.py
2010-02-12 13:56:44,655 INFO C:\home\vampir\SWEB_history\trunk;e_rpc_serv.py
2010-02-12 14:00:02,871 INFO ..\nestle_log_transfer;nestle_trace.py
2010-02-12 14:00:02,887 INFO C:\home\lega\scripts;1c_referror.py
2010-02-12 15:00:00,071 INFO ..\nestle_log_transfer;nestle_trace.py
2010-02-12 16:00:00,063 INFO ..\nestle_log_transfer;nestle_trace.py
2010-02-12 17:00:00,558 INFO ..\nestle_log_transfer;nestle_trace.py
2010-02-12 17:15:04,086 INFO start
2010-02-12 17:15:04,086 INFO C:\home\vampir\SWEB_history\trunk;w.py
2010-02-12 17:15:04,086 INFO C:\home\vampir\SWEB_history\trunk;DataEater.py
2010-02-12 17:15:04,102 INFO C:\home\vampir\SWEB_history\trunk;e_rpc_serv.py
2010-02-12 17:15:04,118 INFO C:\home\lega\squidreader;web.py
2010-02-12 18:00:01,066 INFO ..\nestle_log_transfer;nestle_trace.py
2010-02-12 19:00:01,013 INFO ..\nestle_log_transfer;nestle_trace.py
2010-02-12 20:00:00,990 INFO ..\nestle_log_transfer;nestle_trace.py
а вот использовать logging.exception - хорошая идея

ЗЫ: сегодня с утра ещё ни одного исключения не выскакивало, скрипт несколько раз перезапускал
o7412369815963
свежий екцепт:
2010-02-12 21:43:00,904 CRITICAL except main loop: [Errno 9] Bad file descriptor
время - район 21 часа, вчера так же.

заюзал logging.exception, завтра поглядим :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB