Не работает utf-8 в web-терминале на python c flask

простейший web-терминал, сам по себе он работает, но любая команда(например ping), вывод которой подразумевает кирилицу, првращается в кашу из символов, в чём может быть проблемма и как это можно пофиксить?

введите сюда описание изображения

import subprocess
import os
import signal

from flask import Response




app = Flask(__name__)

# Глобальная переменная для хранения информации о последнем процессе
last_process = {"process": None, "command": None}

@app.after_request
def apply_caching(response: Response):
    response.headers["Content-Type"] = "text/html; charset=utf-8"
    return response




# HTML-шаблон с мета-тегом для кодировки UTF-8
html_template = """
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Web-терминал</title>
</head>
<body>
    <h1>Web-терминал</h1>
    <form method="post" action="/execute">
        <label for="command">Введите команду:</label>
        <input type="text" id="command" name="command" required>
        <button type="submit">Выполнить</button>
    </form>
    <h2>Результат выполнения команды:</h2>
    <pre id="output">{{ output }}</pre>
    <form method="post" action="/kill">
        <button type="submit" style="color: red;">Остановить последнюю команду</button>
    </form>
</body>
</html>
"""

# Главная страница
@app.route("/", methods=["GET"])
def index():
    return render_template_string(html_template, output="")

# Выполнение команды
@app.route("/execute", methods=["POST"])
def execute_command():
    global last_process
    command = request.form.get("command")

    if not command:
        return render_template_string(html_template, output="Команда не указана!")

    try:
        # Запуск команды в отдельном процессе с правильной кодировкой
        process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, text=True)
        last_process["process"] = process
        last_process["command"] = command

        # Чтение результата
        stdout, stderr = process.communicate()
        output = stdout if stdout else stderr
    except Exception as e:
        output = f"Ошибка: {str(e)}"

    return render_template_string(html_template, output=output)


# Завершение последнего процесса
@app.route("/kill", methods=["POST"])
def kill_command():
    global last_process
    if last_process["process"] and last_process["process"].poll() is None:  # Если процесс активен
        os.kill(last_process["process"].pid, signal.SIGTERM)
        last_process["process"] = None
        last_process["command"] = None
        return render_template_string(html_template, output="Последняя команда завершена.")
    else:
        return render_template_string(html_template, output="Нет активной команды для завершения.")


if __name__ == "__main__":
    # Запуск приложения Flask
    app.run(debug=True)

Давно не питонил, но вроде где-то у себя вот так делал

Тут сразу output должен в нужно кодировке прийти

subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, text=True, 
                        encoding="utf-8")

Или вот так (тут просто по получении перекодируете)

output.decode('utf-8')
Вернуться на верх