Bonjour,

J'ai besoin de démarrer un fichier ou un dossier dans l'application associée par défaut sur l'ordinateur (*.txt -> notepad, µ.pdf -> Adobe Acrobat Reader, etc...) en python . Seulement, je souhaite que l'action soit bloquante (ou le devienne, via des opérations).
Le programme continuera son exécution après la fermeture de l'application ouverte (dans cet exemple os.start_file(), mais cela changera surement)
Autrement dit dans ce code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
def start_file(path):
    os.startfile(path)
    # action bloquante
 
start_file("C:\...\file_or_directory")
# code à exécuter après la fermeture de l'application démarré par start_file()
Après de nombreuses recherches, et d'essai avec des commandes windows, en utilisant subprocess, psutils, etc... aucune méthode n'est bloquante.
il y a la solution de vérifier si le fichier est accessible en écriture (mais cela ne fonctionne que pour les fichiers):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def is_file_conflict(filepath: str) -> bool:
    """
    Vérifie si un fichier est accessible en écriture
    :param filepath: chemin d'acces
    :return: boolean du resultat (True: conflit, False: Libre)
    """
    try:
        with open(filepath, 'rb+'):
            return False
    except PermissionError:
        return True
    except FileNotFoundError:
        return False
 
 
def start_file(filepath)
    """
    Ouvre le fichier spécifié dans l'application par défaut, attend la fermeture du fichier (débloquage en écriture)
    Attention, cette fonction est bloquante (que pour les fichiers hors blocnote)
    """
    # ouvre le fichier dans l'application associée par défaut sur l'ordinateur
    os.startfile(filepath)
    # temporise ouverture fichier (ouvrir fichier prend du temps)
    time.sleep(5)
    # vérifie régulièrement si le fichier est ouvert ( = en cours de modification)
    while is_file_conflict(filepath):
        time.sleep(1)
 
    print(f'file {filepath} closed')
    return True
Merci d'avance,

Dymon