2011-02-07 15 views
1

これを行う方法はたくさんあるかもしれませんが、これを行う方法を探し始める場所がわからないので尋ねています。私はいくつかの基本的なbashコマンドを実行し、出力に基づいて特定の電子メールアドレスに電子メールを送信するpythonスクリプトを持っています。その情報がスクリプトの最終出力と異なる場合にのみ電子メールが送信されるようにしたいと思います。円柱のpythonスクリプトは、前回の実行結果を使用する必要があります

私は 'lpstat -p'を実行し、プリンタ 'a'が無効になっているため、cronはスクリプトを1時間後に実行するため、電子メールを送信します。電子メール通知。

私は詳細まで説明しているかもしれませんが、実際にはスクリプトの以前の実行で何が起こったのかをスクリプトが知りたいだけです。私はファイルに "タッチ"を実行することができることを知っているが、それはあまりにも原始的なように思えるので、あまりにも複雑になることなく、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() 

答えて

5

shelveモジュールは非常に単純な永続的な辞書をPythonで提供します。

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

+0

ここでShelveモジュールがおそらく私のお気に入りです。それはフードの下でPickleを使用するので、他の答えのいくつかを含んでいますが、その使い易さは、PickleやcPickle IMHOのより良い代替手段になり、スクリプトが並行性を心配する必要がない限り、私が遭遇した棚。 –

+0

非常に役に立ちます。これは、SQLiteセットアップのようなものを手に入れることなく、スクリプトを実行するたびに何が起こるのかを把握するのが、最も面倒な方法です。どうもありがとう。 – jphenow

1

私はあなたがまっすぐピクルスや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) 
+0

これは甘いです。あなたが与えてくれたより詳細な説明は、このスクリプトをもっと早く簡単に終わらせることになります。私はこれを使わなければならないかもしれませんが、私は見ることになるでしょう - 私は学生労働者なので、私は時間の小さなバーストでスクリプトに取り掛かるだけです。 – jphenow

関連する問題