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 :

L'inverse de os.startfile


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut L'inverse de os.startfile
    Bonjour,
    Avec os.startfile(nom_fichier.pdf), on peut ouvrir le fichier.pdf avec abode reader. Je voulais savoir s'il existait une syntaxe pour faire l'opération inverse; c'est à dire, le fichier pdf est ouvert et affiché à l'écran et je souhaiterais pouvoir le fermer à partir d'un code python (opération nécessaire avant de lancer une autre application qui modifiera le fichier pdf en question ouvert).
    Je ne sais pas si ma question est suffisamment claire et si c'est le cas, je ne sais pas si c'est possible...

    Merci pour vos réponses.

    Gabriel

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 279
    Points : 36 765
    Points
    36 765
    Par défaut
    Salut,

    Dire si le fichier .PDF est encore "ouvert" n'est pas lié à l'état de l'application qui affiche son contenu est encore active: l'application pouvant lire le fichier en mémoire et le fermer avant d'afficher son contenu.

    Comme os.startfile ne retourne aucune information sur l'application qui a été lancée, difficile de la fermer.

    Je ne vois pas trop comment s'en sortir sans ré-écrire un équivalent à os.startfile pour:
    • récupérer les applications associées à l'extension .PDF,
    • en lancer une au choix via subprocess.X (ou autre, le but est de savoir "qui"),
    • fermer l'application qui verrouille le fichier.


    récupérer les applications associées une extension comme .pdf est OS dependant: sous windows vous avez les commandes assoc .pdf qui vous retourne un nom à passer dans ftype pour récupérer la commande...

    nota, os.startfile (sous Windows) peut se contenter de lancer "start nom.PDF" et comme start se termine après avoir lancé un autre process, l'information ne remonte pas.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut
    Bonjour,

    Merci pour la réponse; çà me paraît bien compliqué (pour moi) à créer un remplaçant de os.startfile qui conserve en plus les informations adéquates pour pouvoir fermer l'application.

    Si j'ai bien compris, si l'application abodereader est active, il est presque impossible de la fermer à partir d'un code python relativement simple et donc je dois continuer à la fermer à la <<main>>?

    Gabriel

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Les versions 'simples'

    Si c'est Acrobat reader la version 'sauvage':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system("taskkill /f /im AcroRd32.exe")
    Vous pouvez aussi trouver le PID et faire un os.kill.


    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 279
    Points : 36 765
    Points
    36 765
    Par défaut
    Salut,

    çà me paraît bien compliqué (pour moi) à créer un remplaçant de os.startfile qui conserve en plus les informations adéquates pour pouvoir fermer l'application.
    Si vous voulez que le programme Python "dirige" le lancement et la fermeture de programmes tiers, il faut bien arriver à contrôler un peu ce qu'il se passe.

    os.startfile se contentant de lancer l'application (ce qui n'est pas si mal) mais ne retourne aucune information pour savoir laquelle fermer est un peu court pour faire cela.

    Si vous cibler Windows, vous avez aussi la possibilité de passer par l'API COM.
    La fonction GetObject permet de lancer l'application correspondante au fichier et de récupérer les informations correspondantes. Vous trouverez des exemples de code ici sur le blog de Tim Golden.

    Il reste aussi la méthode sauvage proposée par PauseKawa. Mais elle ne fonctionnera que s'il y a une seule instance de l'application lancée à ce moment là.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Difficile de faire moins 'sauvage' sans plus d'information (sans passer par l'api win32)

    Pour ce qui est de Mais elle ne fonctionnera que s'il y a une seule instance de l'application lancée à ce moment là, et pour rester simple, il reste la solution du génocide dans le style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from win32com.client import GetObject
    WMI = GetObject('winmgmts:')
    processes = WMI.InstancesOf('Win32_Process')
    for proc in processes:
        if proc.Properties_("Name").Value == name:
            print(proc.Properties_("ProcessID").Value)
    Ou l'on remplace le print par os.kill.

    Cela reste l'équivalent d'un tskill %process% /A avec un test IF %errorlevel%==0 sur TaskList | findstr /c:%process%.exe en batch
    C'est sur que Python mérite mieux.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    Merci pour les réponses.
    Je vais essayer d'éviter les pg <<sauvages>> et je vais regarder avec les applications winapi;
    Encore merci.

    gabriel

Discussions similaires

  1. inverser l'écran
    Par relax_06 dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/03/2004, 12h20
  2. inverser la lecture d'une requète
    Par nilaco dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/08/2003, 12h16
  3. [VB6] [Graphisme] Inversion dans picturebox
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 16/04/2003, 15h05
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. [VB6]fonction inverse de Hex (nombres hexadécimaux)
    Par Guigui_ dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2002, 19h31

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