Прежде всего, убедитесь, что вы приняли к сведению предупреждение от pynput docs :
Запуск прослушивателя клавиатуры может быть связан с некоторыми ограничениями на вашей платформе.
Если вы находитесь на Ма c, как я, вам нужно сделать следующее:
- Процесс должен выполняться как root.
- Ваше приложение должно быть занесено в белый список под Включить доступ для вспомогательных устройств .
Для этого второго элемента отметьте эти шаги из соответствующего сообщения SO.
Теперь, для реальной проблемы записи файла, одним из решений является вызов f.flush()
после вызова f.writelines
, чтобы убедиться, что данные фактически записаны в файл , (см. этот пост для объяснения: что именно делает python file.flu sh ()? ). Я не знаком с базовой реализацией pynput, но в документах говорится, что он использует потоки, и это, похоже, влияет на файловый ввод / вывод. Также рекомендуется вызывать 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()
Альтернативный и лучший способ - использовать выражение with
при записи в файл . Это ставит 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()