IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Fonction bloquante pour démarrer fichier ou dossier dans application par défaut


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Apprenti dev Python
    Inscrit en
    Août 2021
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti dev Python

    Informations forums :
    Inscription : Août 2021
    Messages : 63
    Points : 40
    Points
    40
    Par défaut Fonction bloquante pour démarrer fichier ou dossier dans application par défaut
    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

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par dymon2021 Voir le message
    Seulement, je souhaite que l'action soit bloquante (ou le devienne, via des opérations).
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import subprocess
    def start_file(path):
    	subprocess.Popen(path, stdout=subprocess.PIPE).communicate()
     
    start_file("C:\...\file_or_directory")
    # code à exécuter après la fermeture de l'application démarré par start_file()

  3. #3
    Membre du Club
    Homme Profil pro
    Apprenti dev Python
    Inscrit en
    Août 2021
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti dev Python

    Informations forums :
    Inscription : Août 2021
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Bonjour,
    merci pour votre réponse, seulement j'obtiens une erreur (différente si j'ouvre un fichier ou un dossier):
    Erreur pour l'ouverture d'un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OSError: [WinError 193] %1 n’est pas une application Win32 valide
    Erreur pour l'ouverture d'un dossier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileNotFoundError: [WinError 2] Le fichier spécifié est introuvable
    Dymon

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 265
    Points : 1 843
    Points
    1 843
    Par défaut
    si le fichier/dossier comporte des espaces dans son chemin complet, il faut probablement l'encapsuler dans des guillemets

  5. #5
    Membre du Club
    Homme Profil pro
    Apprenti dev Python
    Inscrit en
    Août 2021
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti dev Python

    Informations forums :
    Inscription : Août 2021
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Ce n'est pas le cas,
    D'ailleurs l'erreur FileNotFound survient lorsque que je passe un dossier dans start_file()

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dymon2021 Voir le message
    seulement j'obtiens une erreur
    Effectivement. La commande os.startfile() passe par l'association "extension = programme" de Windows, donc on lui donne un fichier et elle se débrouille pour le faire ouvrir automatiquement... mais le module subprocess, lui, nécessite de spécifier explicitement le programme associé au fichier. Autrement dit on peut appeler os.startfile("toto.avi") et le truc ouvrira tout seul vlc ou un autre lecteur vidéo, mais si on remplace par subprocess.Popen() il faut spécifier explicitement subprocess.Popen(("vlc", "toto.avi"), ..., ...).

    Désolé. Peut-être que le module pywin32 peut t'aider, moi pas.

  7. #7
    Membre du Club
    Homme Profil pro
    Apprenti dev Python
    Inscrit en
    Août 2021
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti dev Python

    Informations forums :
    Inscription : Août 2021
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Ok merci, j'irai voir

Discussions similaires

  1. [Python 2.X] utiliser des fonction d'un autre fichier se trouvant dans le meme dossier
    Par nivlem dans le forum Général Python
    Réponses: 9
    Dernier message: 19/01/2018, 17h58
  2. [XL-2007] Comment remplacer la fonction indirect pour un fichier fermé ?
    Par Rhapsodys dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/09/2012, 09h50
  3. Ordre des fichiers et dossiers dans un dossier
    Par piotrr dans le forum Windows
    Réponses: 1
    Dernier message: 19/08/2009, 01h18
  4. Réponses: 5
    Dernier message: 16/06/2009, 16h03
  5. Réponses: 0
    Dernier message: 17/12/2007, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo