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()
和类似的事情超出了我的理解范围。
所以我的问题是:为什么会发生这种情况,我该如何解决?
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')
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
我正在编写一个基于文本的游戏,我需要读取按键。由于各种原因,我通过读取键盘缓冲区来做到这一点。这是我当前的代码:
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()
和类似的事情超出了我的理解范围。
所以我的问题是:为什么会发生这种情况,我该如何解决?
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')
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