Python 获取键盘缓冲区的文件长度

Python Get File Length Of Keyboard Buffer

我正在编写一个基于文本的游戏,我需要读取按键。由于各种原因,我通过读取键盘缓冲区来做到这一点。这是我当前的代码:

while True:
    file = open("/dev/input/event3","rb")
    data = file.read(45)
    character = data[42:43].hex()
    press = data[44:45].hex()

问题是,程序会等到它读取了 45 个字节。我不想要这个,因为程序应该做其他事情(比如充电法力)。所以我认为程序可以检查文件是否为空,如果不是,就会有一个新的按键,我可以读取它。所以我写了这段代码:

while True:
    file = open("/dev/input/event3","rb")
    while True:
        if os.stat("/dev/input/event3").st_size > 0:
            data = file.read(45)
            break
    character = data[42:43].hex()
    press = data[44:45].hex()

但是 os.stat("dev/input/event3").st_size 返回了 0。 我也试过 os.path.getsize("/dev/input/event3"),但它也返回了 0

我考虑过线程化作为一种​​可能的解决方案,但它对我来说有点太复杂了,尤其是在将变量从一个线程传输到另一个线程时(而且 Lock() 和类似的事情超出了我的理解范围。

所以我的问题是:为什么会发生这种情况,我该如何解决?

使用 os.path.getsize(path)

Return the size, in bytes, of path. Raise OSError if the file does not exist or is inaccessible.

import os
os.path.getsize('C:\Python27\Lib\genericpath.py')

或使用os.stat(path).st_size

import os
os.stat('C:\Python27\Lib\genericpath.py').st_size 

或使用Path(path).stat().st_size (Python 3.4+)

from pathlib import Path
Path('C:\Python27\Lib\genericpath.py').stat().st_size

取自此堆栈的答案:https://whosebug.com/posts/6591957/edit 来自用户@Artsiom Rudzenka


除此之外,您还应该使用“sys.path[0]”来获取完整路径
所以它可以像:
filename = sys.path[0] + "/dev/input/event3"

但是您应该检查 pathName 而不是打开的文件。

我找到了一个解决方案,它使用线程,但没那么复杂。 添加此功能:

def key_listener():
    while True:
        keyboard_buffer = open("/dev/input/event3","rb")
        data = keyboard_buffer.read(45)
        keyboard_buffer.close()
        character = data[42:43].hex()
        press = data[44:45].hex()
        save_file = open(sys.path[0] + "/key.txt", "w")
        save_file.write(character + "\n" + press)
        save_file.close()
key_listen_thread = threading.Thread(target=key_listener, daemon=True)
key_listen_thread.start()

查看某个键是否被pressed/was按下:

save_file = open(sys.path[0] + "/key.txt", "r+")
lines = save_file.readlines()
save_file.write("") # Optional, will delete contents of file
save_file.close()
keycode = "21"
press = "01" # 00 = released, 01 = pressed
try:
    if lines[0].replace("\n", "") == keycode and lines[1] == press: # Do something
except IndexError:
    pass