Перезапись хода выполнения скрипта Python в терминале: проблемы с длинными сообщениями, разрывами строк и перезаписьюPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Перезапись хода выполнения скрипта Python в терминале: проблемы с длинными сообщениями, разрывами строк и перезаписью

Сообщение Anonymous »

Я создаю скрипт, который показывает прогресс в терминале как:
"[?] Анализ: C:\Users\user\ntuser.dat.LOG2"
И его нужно перезаписать к следующему проанализированному файлу, потому что если я анализирую весь компьютер, журнал будет внутренним. Я добился частичного решения, потому что есть случаи, когда оно не работает. Вот решение:

Код: Выделить всё

def get_file_owner(filepath, config):
try:
result = subprocess.check_output(['icacls', filepath], universal_newlines=True)
for line in result.splitlines():
if "ENAGAS" in line:
owner = line.split(":")[0].strip()
return owner
print_progress(f"No OWNER found for {filepath}",config, message_type="debug")
except subprocess.CalledProcessError as e:
print_progress(f"Error retrieving file owner for {filepath}: {e}", config, message_type="debug")
except Exception as e:
print_progress(f"Unexpected error for {filepath}: {e}", config, message_type="debug")

return "Unknown"

def print_progress(message, config, message_type):
global last_message_length, last_message_type

# Map message types to the required verbosity levels
verbosity_requirements = {
"analyzing": 0,  # Level 0: Minimal output, show analyzing messages
"info": 1,   # Level 1: Show positive results and general information
"skipping": 2,       # Level 2: Show skipped files and errors
"debug": 3       # Level 3: Debugging details
}

# Get the required verbosity for the message type
required_verbosity = verbosity_requirements.get(message_type, 0)

verbosity_level = config["verbosity_level"]

# If the verbosity level is not sufficient (except for info), return early
if verbosity_level < required_verbosity:
return

if last_message_type == "analyzing":
print(" " * last_message_length, end='\r')

# Print the appropriate message based on the type and verbosity level
if message_type == "analyzing":
print(f"[?] {message}", end='\r')
last_message_length = len(message) + 25

elif message_type == "info" and verbosity_level >= 1:
if last_message_type == "analyzing":
print(" " * last_message_length, end='\r')
print(f"{COLOR_GREEN}[INFO] {message}{COLOR_RESET}")
last_message_length = len(message) + 25

elif message_type == "skipping" and verbosity_level >= 2:
if last_message_type == "analyzing":
print(" " * last_message_length, end='\r')
print(f"{COLOR_RED}[-] {message}{COLOR_RESET}")
last_message_length = 0  # Reset length for skipping messages

elif message_type == "debug" and verbosity_level >= 3:
if last_message_type == "analyzing":
print(" " * last_message_length, end='\r')
print(f"{COLOR_DEBUG}DEBUG: {message}{COLOR_RESET}")
last_message_length = len(message) + 25  # Keep length for debug messages

last_message_type = message_type

# Flush the output to ensure it shows up immediately
sys.stdout.flush()
Это стирает данные терминала, но не знаю, лучший ли это способ, я так не думаю. Одна из проблем заключается в том, что когда это другое сообщение, например информационное сообщение, оно не всегда достаточно длинное, чтобы перезаписать весь анализ:
Отображение текста:
[ИНФО] [+] Конфиденциально данные найдены в имени файла: id_rsaa.pub
[INFO] [+] Конфиденциальные данные найдены в имени файла: id_rsa.pubtxt
Другая проблема: строка длиннее терминала ширина, это просто «случайный» переход на другую строку.

Еще одно изображение, показывающее проблемы, когда терминал слишком мал и сообщения разбиваются на две строки.
Я думаю это можно решить другим способом, но я его не нашел.
Я ожидаю вывода, который при анализе файлов показывает «[?] Анализ: [текущий_файл]», и с все остальные сообщения (отладка, информация, пропуск) остаются на терминале, если их запрашивают на уровне детализации.

Подробнее здесь: https://stackoverflow.com/questions/791 ... sages-line
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»