Scipt for choise a log and dowload it

Hello, i have a raspberry pi connected to my pixhawk 6x by ethernet for uxrce/client agent communication and by usb for mavlink.
I need a script on the raspberry to list , choise and download a log file.
It work perfectly manually:

mavproxy.py --master=/dev/ttyACM0,57600
log list
log download 3 (for exemple)

I need a scipt to do that , he connect the pixhawk , he list the log and ask me witch log i want to download and download it !!
Can someone help me please ?

I have tried an sh script

#!/bin/bash

# Variables
SERIAL_PORT='/dev/ttyACM0'  # Port série USB du Pixhawk et vitesse ?
LOG_DIR='/home/zit/logs'

# Démarrer MAVProxy
mavproxy.py --master="serial:${SERIAL_PORT}" --console &
MAVPROXY_PID=$!

# Attendre que MAVProxy soit prêt
sleep 5  # Attendre quelques secondes pour que MAVProxy démarre

# Demander la liste des logs
echo "Demande de la liste des logs..."
echo "log list" > /tmp/mavproxy_command

# Attendre la réponse avec la liste des logs
sleep 5  # Attendre quelques secondes pour la réponse
LOG_LIST=$(cat /tmp/mavproxy_response | grep "log list" | tail -n +2)

# Afficher la liste des logs et demander à l'utilisateur de choisir
echo "Liste des logs disponibles :"
echo "${LOG_LIST}"

echo "Entrez le numéro du log à télécharger :"
read LOG_NUMBER

# Sélectionner le log choisi par l'utilisateur
SELECTED_LOG=$(echo "${LOG_LIST}" | sed -n "${LOG_NUMBER}p")

# Télécharger le log sélectionné
echo "log download ${SELECTED_LOG}" > /tmp/mavproxy_command

# Attendre que le téléchargement soit terminé (vous pouvez ajuster le délai)
sleep 10

# Déplacer le log téléchargé dans le répertoire spécifié
LOG_PATH="$(pwd)/${SELECTED_LOG}"
DESTINATION_PATH="${LOG_DIR}/${SELECTED_LOG}"
mv "${LOG_PATH}" "${DESTINATION_PATH}"

echo "Log téléchargé avec succès : ${SELECTED_LOG}"
echo "Log enregistré dans : ${DESTINATION_PATH}"

# Terminer MAVProxy
kill -9 ${MAVPROXY_PID}

i have tried python script with mavproxy :

import subprocess
import threading
import time
import os

def read_output(proc, logs_listed_event, download_complete_event):
    """ Lit continuellement la sortie de MAVProxy. """
    while True:
        line = proc.stdout.readline()
        if line:
            print("MAVProxy output:", line, end='')
            if "Log" in line and "numLogs" in line:
                logs_listed_event.set()
            if "Finished downloading log" in line:
                download_complete_event.set()
                break  # Arrêter de lire après la fin du téléchargement

def send_command(proc, command):
    """ Envoie une commande à MAVProxy. """
    print(f"Envoi de la commande: {command}")
    proc.stdin.write(command + '\n')
    proc.stdin.flush()

def get_user_input():
    """ Demande à l'utilisateur de choisir un numéro de log à télécharger. """
    try:
        return int(input("Entrez le numéro du log à télécharger : "))
    except ValueError:
        print("Veuillez entrer un nombre valide.")
        return get_user_input()

def main():
    logs_dir = "/chemin/vers/votre/dossier/de/logs"  # Remplacez par votre chemin
    os.makedirs(logs_dir, exist_ok=True)

    mavproxy_cmd = "mavproxy.py --master=/dev/ttyACM0"
    proc = subprocess.Popen(mavproxy_cmd.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, cwd=logs_dir)

    logs_listed_event = threading.Event()
    download_complete_event = threading.Event()

    output_thread = threading.Thread(target=read_output, args=(proc, logs_listed_event, download_complete_event))
    output_thread.start()

    time.sleep(5)  # Attendre que MAVProxy initialise

    send_command(proc, 'log list')
    time.sleep(1)
    send_command(proc, 'log list')

    logs_listed_event.wait()

    log_num = get_user_input()
    send_command(proc, f'log download {log_num}')

    download_complete_event.wait()

    # Fermer le processus MAVProxy proprement
    send_command(proc, 'exit')  # Ou 'quit', selon ce qui fonctionne avec votre MAVProxy
    proc.terminate()
    try:
        proc.wait(timeout=5)
    except subprocess.TimeoutExpired:
        proc.kill()

    output_thread.join()

    # Transférer le fichier via SCP
    log_filename = f'log{log_num}.bin'  # Assurez-vous que le nom de fichier correspond au format réel
    scp_command = f"scp {log_filename} dcas@192.168.1.100:/home/dcas/o.quirant/logscp/"
    subprocess.run(scp_command.split())

if __name__ == '__main__':
    main()


And i have trie witth pymavlink !

import os
from pymavlink import mavutil

# Fonction pour établir la connexion
def connect_pixhawk(port='/dev/ttyACM0', baud=57600):
    print(f"Connexion au Pixhawk sur {port} avec un baud rate de {baud}")
    master = mavutil.mavlink_connection(port, baud=baud)
    master.wait_heartbeat()
    print("Pixhawk connecté!")
    return master

# Fonction pour lister les logs
def list_logs(master):
    master.mav.log_request_list_send(master.target_system, master.target_component, 0, 0xFFFF)
    logs = []
    last_log_num = None

    while True:
        msg = master.recv_match(type='LOG_ENTRY', blocking=True)
        if msg is None:
            continue
        print(f"Log ID: {msg.id}, Taille: {msg.size}")
        logs.append(msg.id)
        last_log_num = msg.last_log_num

        if msg.id == last_log_num:
            break

    return logs

# Fonction pour télécharger un log
def download_log(master, log_id, directory):
    print(f"Téléchargement du log {log_id}...")
    master.mav.log_request_data_send(master.target_system, master.target_component, log_id, 0, 0xFFFFFFFF)

    with open(os.path.join(directory, f"log_{log_id}.bin"), 'wb') as log_file:
        while True:
            msg = master.recv_match(type='LOG_DATA', blocking=True)
            if msg is None or msg.id != log_id:
                continue
            if msg.ofs >= msg.size:
                break
            log_file.write(msg.data)
        print(f"Log {log_id} téléchargé dans {directory}")

# Début du script
master = connect_pixhawk()

# Liste des logs disponibles
logs = list_logs(master)

# Attendre l'entrée de l'utilisateur
log_id = int(input("Entrez l'ID du log à télécharger: "))
if log_id in logs:
    download_log(master, log_id, "/home/zit/logs")
else:
    print("ID de log invalide.")

# Fermeture de la connexion
master.close()
print("Connexion fermée.")