Окружающий скрипт на Python, нужно использовать результаты предыдущих запусков - PullRequest
1 голос
/ 07 февраля 2011

Хорошо, я уверен, что может быть много способов сделать это, но я спрашиваю, потому что я не знаю, где начать искать способ сделать это.У меня есть сценарий Python, который выполняет некоторые основные команды bash и на основе результатов будет отправлять письмо на указанный адрес электронной почты.Я хочу сделать так, чтобы электронное письмо отправлялось только в том случае, если эта информация отличается от последнего вывода скрипта.

Итак, я запустил 'lpstat -p', и он отправил письмо, потому что принтер '«отключен», и cron снова запускает сценарий через час. Я хочу, чтобы другое электронное письмо отправлялось только в том случае, если что-то, отличное от «а», требует уведомления по электронной почте.

Возможно, я слишком подробно рассказал, но на самом деле я просто хочу, чтобы сценарий узнал, что произошло в предыдущих запусках сценария - имеет ли это смысл?Я знаю, что могу выполнить «прикосновение» к файлу, но это кажется довольно примитивным, поэтому мне было интересно, есть ли у Python хороший встроенный способ справиться с этим, не становясь слишком сложным.

Вот краткий примерчто я делаю, если мое объяснение не имеет смысла.

# The string used to find disabled pritners based on the stdout of lpstat
string_check = 'disabled'
stdout = commands.getoutput( 'lpstat -p' )
lpout  = stdout.split( '\n' )
disabled = []

# Cycle through the output of lpstat which has been split into tokens based on each line of the output and save the lines that have a substring match with string_check
for line in lpout:
    if string_check in line:
        disabled.append( line )

# Initiate the required variables for constructing a basic email
new_message = ""
SERVER = ""
FROM = ""
TO = ""
SUBJECT = ""
TEXT = ""
message = ""

# Just some string manipulation - tries to remove useless, redundant information from the lpstat output
for line in disabled:
    line = line.replace( "printer ", "" )
    line = line.replace( " is ", "" )
    line = line.replace( "idle.", "\t" )
    line = line.replace( string_check, "\t" )
    new_message += "\t" + line + "\n"

SERVER = "localhost"

FROM = "email"
TO = "email"
SUBJECT = "Printer unnexpectedly disabled"
TEXT = new_message

# Email template
message = """\
From: %s
To: %s
Subject: %s

Printers that seem to be disabled:

%s
""" % ( FROM, TO, SUBJECT, TEXT )

# if there ended up being some stuff in the disabled array then send the email
if len( disabled ) > 0:
    server = smtplib.SMTP( SERVER )
    server.sendmail ( FROM, TO, message )
    server.quit( )

Ответы [ 2 ]

5 голосов
/ 07 февраля 2011

Модуль shelve предлагает очень простой постоянный словарь в Python.

http://docs.python.org/library/shelve.html

1 голос
/ 08 февраля 2011

Я предлагаю вам перейти непосредственно к использованию Pickle или JSON, вы получите гораздо больше гибкости, чем полки.Обратите внимание, что этот код будет работать почти одинаково с Pickle, JSON или Yaml.

В основном вы выписали бы объект, который хотели в конце выполнения:

json.dump(disabled, open('disabled_list.json', 'wb'))

Затем вВ начале следующего запуска вы загрузите этот объект json обратно и отфильтруете новые строки, основываясь на том, что его там не было раньше:

previously_disabled = json.load(open('disabled_list.json, 'rb'))
#...
if string_check in line and line not in previously_disabled:
    disabled.append( line )
...