将按键存储到文本文件中

20 浏览
0 Comments

将按键存储到文本文件中

这个问题已经有了答案:

我该怎么处理“ImportError: 无法导入名称X”或“AttributeError:(很可能由于循环导入)”?

我从https://pynput.readthedocs.io/en/latest/keyboard.html中拿了一段代码,并将其修改为将按键存储到文本文件中。 但是,我在输出中收到了错误消息:

ImportError: cannot import name 'keyboard' from 'pynput'

搜索谷歌后出现...

from pynput.keyboard import Key, Listener

...但即使这个导入也与我的代码不兼容。 我已从上面的链接中下载了python3的pynput。 原始代码如下:

from pynput import keyboard
    def on_press(key):
        try:
            print('alphanumeric key {0} pressed'.format(key.char))
        except AttributeError:
            print('special key {0} pressed'.format(key))
    def on_release(key):
        print('{0} released'.format(key))
        if key == keyboard.Key.esc:
            # Stop listener
            return False
    # Collect events until released
    with keyboard.Listener(on_press=on_press,on_release=on_release) as listener:
        listener.join()

修改后的代码:

import pynput
from pynput import keyboard
def on_press(key):
    with open("keylogger.txt", "a") as f:
        try:
            f.print('alphanumeric key {0} pressed'.format(key.char))
        except AttributeError:
            f.print('special key {0} pressed'.format(key))
def on_release(key):
    with open("keylogger.txt", "a") as f:
        f.print('{0} released'.format(key))
        if key == keyboard.Key.esc:
            # Stop listener
            return False
# Collect events until released
with keyboard.Listener(on_press=on_press,on_release=on_release) as listener:
    listener.join()

我是否遗漏了一些东西,以使程序正确地将按键存储到文本文件中?

admin 更改状态以发布 2023年5月22日
0
0 Comments

首先,不要把Python文件命名为与模块名称相同。

ImportError: cannot import name 'keyboard' from 'pynput' (/root/Testing6/Sample6_2/pynput.py) 

Python在pynput脚本中查找keyboard时,实际上是在寻找`pynput`模块。请参考模块搜索路径

当导入名为spam的模块时,解释器首先查找具有该名称的内置模块。如果找不到,则在由变量sys.path给出的目录列表中搜索名为spam.py的文件。sys.path从以下位置初始化:

  • 包含输入脚本的目录(或未指定文件时的当前目录)。
  • PYTHONPATH(具有与shell变量PATH相同的语法的目录名称列表)。
  • 安装相关的默认值。

在这里,Python在当前目录中找到了一个名为pynput的模块,而不是你实际需要的那个模块keyboard。因此,你只需将其重命名为其他名称(例如mykeylogger.py)。你目前的导入代码应该正常工作。

from pynput import keyboard

其次,不存在f.print。文件对象没有print方法。请将所有的f.print更改为f.write

def on_press(key):
    with open("keylogger.txt", "a") as f:
        try:
            f.write('alphanumeric key {0} pressed'.format(key.char))
        except AttributeError:
            f.write('special key {0} pressed'.format(key))

最后,注意pynput有一些平台限制可能导致它无法工作。对于Linux,你只需确保:

  • 必须运行X服务器。
  • 必须设置环境变量$DISPLAY

在此之后,您的程序将正常运行。

$ python3 mykeylogger.py
aaabbb
^CTraceback (most recent call last):
...
KeyboardInterrupt
$ cat keylogger.txt
alphanumeric key a pressed'a' releasedalphanumeric key a pressed'a' releasedalphanumeric key a pressed'a' releasedalphanumeric key b pressed'b' releasedalphanumeric key b pressed'b' releasedalphanumeric key b pressed'b' releasedspecial key Key.enter pressedKey.enter releasedspecial key Key.ctrl pressedalphanumeric key  pressed

0