Python - atexit | Вычисление глобального времени внутри аргументов ключевого слова функции при выходе из процесса - PullRequest
0 голосов
/ 25 июня 2019

Когда я использовал def foo(time = calculate_time()): ..., параметры (time) равны 0

I предположим, , что присвоение аргумента ключевого слова или atexit процесс отличается от основного процесса, поэтому время не имеет значения

from time import time as get_time()

start_time = get_time() # Calculated at the time the application starts

def calculate_time():
    global start_time
    return get_time() - start_time

...

# Set the function which executed on exit
atexit.register(save_to_file)

Пожалуйста, посмотрите на строки комментариев в коде, который является моим скриптом KeyLogger:

Пример проблемного случая:

  • Запуск скрипта Python
  • Немедленно нажмите END Кнопка
  • С плавающим нулевым исключением при выполнении atexit.register(save_to_file)
  • Строка: lines.append(f"Saniye başı tuş basımı (key/s): {len(pressedKeys) / passing_time}")
from pynput import keyboard
import atexit
from time import time as get_time
from datetime import datetime

LOG_FILE = "keyLog.txt"
DELIM = "|"
TIME_LIMIT = 20 * 60

start_time = get_time()
pressedKeys = []

def calculate_time():
    global start_time
    return get_time() - start_time

# Why calculate_time() returns 0 ?
def save_to_file(passing_time = calculate_time()):
    global pressedKeys

    if passing_time is None:
        passing_time = calculate_time() # Why calculate_time() doesn't return ?

    with open(LOG_FILE, "a+", encoding="utf-8") as file:
        lines = []
        lines.append(f"\n\n\n\n")
        lines.append(f"Tarih (Yıl-Ay-Gün Saat-Dakika-Saniye.): {datetime.now()}")
        lines.append(f"Geçen süre (s):                         {passing_time}")
        lines.append(f"Basılan karakter:                       {len(pressedKeys)}")
        lines.append(f"Saniye başı tuş basımı (key/s):         {len(pressedKeys) / passing_time}")
        lines.append(f"\n")
        lines.append("|".join(pressedKeys))

        file.write("\n".join(lines))

# Set the function which executed on exit
atexit.register(save_to_file)

# Kill process when 'END' is clicked
def on_press(key):
    global pressedKeys

    char = None
    try:
        char = key.char
    except AttributeError:
        char = str(key)

    pressedKeys.append(char)

    time = calculate_time()
    if time > TIME_LIMIT:
        save_to_file(time)


def on_release(key):
    print("")
    if key == keyboard.Key.end:
        # Stop listener
        return False

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

1 Ответ

1 голос
/ 25 июня 2019

Значение по умолчанию для аргумента ключевого слова рассчитывается при определении функции, а не при ее выполнении.

time.time имеют, самое большее, точность базовой ОС.Он пытается вычислить время, необходимое для назначения списка и определения функции, которое, как ожидается, округляется до нуля (занимает микросекунды).

Просто измените значение по умолчанию на None и if внутри вашегоФункция рассчитает разницу во времени, когда она вызывается.

...