Перезапись хода выполнения скрипта 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()
Это стирает терминал, но я не знаю, лучший ли это способ; Я так не думаю. Одна из проблем заключается в том, что когда он печатает другое сообщение, например информационное сообщение, оно не всегда достаточно длинное, чтобы перезаписать весь анализ:
[img]https://i.sstatic .net/JPVenK2C.png[/img]

Другая проблема заключается в том, что когда линия длиннее ширины терминала, происходит просто «случайный» переход на другую строку.
Изображение

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

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

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

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

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

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

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

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