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 :

Remplacer un os.system('which ' + appli) ?


Sujet :

Python

  1. #1
    Membre Expert 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
    Par défaut Remplacer un os.system('which ' + appli) ?
    Bonjour,

    J'ai beau chercher je ne trouve pas de buildin équivalent à un which (Utilitaire linux permettant de savoir ou est un exécutable, si celui ci est dans les chemins de l'utilisateur).

    Pour le moment je fait un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try:
        Verif_Appli = os.system('which ' + Programmearechercher)
    puis un :

    Mais j'aimerais bien faire cela en python.

    Pas question de faire une recherche car c'est bien plus long qu'un os.system('which'...).

    Il me semblerais que la solution serait de 'simuler' le lancement de l'application recherchée mais je ne vois pas comment faire...

    Avez vous une idée ?

    Merci d'avance.

  2. #2
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Salut

    Tu peux prendre la variable d'environnement $PATH et chercher avec.

  3. #3
    Membre Expert 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
    Par défaut
    C'est beaucoup trop long par rapport à la commande os.system('which ' + prog) qui est instantanée.
    Si quelqu'un a tester une version 'windows' je prend.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 050
    Par défaut
    Une idée peut-être intéressante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import os
    >>> def which(file):
    ...     for path in os.environ["PATH"].split(":"):
    ...         if file in os.listdir(path):
    ...             print "%s/%s" % (path, file)
    Résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> which("python")
    /usr/bin/python

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Cherche pas...
    Le which prend chaque dossier dans le path, et trouve le fichier demandé dans ces dossiers.

    Edit: lol, pdt que j'écris, un edit et un message de plus... Bref je répondais à ta question précédente.
    Dans windows, c'est pareil. Le path, et tu cherches.

  6. #6
    Membre Expert 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
    Par défaut
    Je pense que je vais tester cela en fait...
    Avec un os.environ sur le path et deux trois choses (mille en fait mais bon ) d'une autre de mes discussions cela devrais donner quelque chose de bien et de plus 'universel'.
    Pas de Résolu pour le moment : Je poste mon code pour avis à la fin.
    Mais là j'ai pas mal à faire avec l'autre discussion en question

  7. #7
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def which(name):
        for directory in os.environ["PATH"].split(os.pathsep):
            if os.path.isfile(os.path.join(directory, name)):
                return os.path.join(directory, name)
     
        raise NotFoundException()
    Voila de quoi satisfaire l'universalité, au moins pour windows et *nix.

  8. #8
    Membre Expert 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
    Par défaut
    C'est vraiment pas mal et cela évite le try et le != 256.

    Par contre plutot qu'un raise que pense tu de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import os.path
     
    def which(NomProg):
        RepProg = [ directory for directory in os.environ["PATH"].split(os.pathsep) if os.path.isfile(directory + Separateur + NomProg) ]
        return RepProg
     
    NomProg = 'acroread' # Envoyer par un widget
    Separateur = os.sep 
    RechAppli = which(NomProg)
    if RechAppli: print RechAppli[0] + Separateur + NomProg # Poursuivre le traitement
    else: print 'Pas dans le path' # A remplacer par ProgIconnu(NomProg)

  9. #9
    Membre Expert 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
    Par défaut
    Peut être même un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def which(NomProg):
        CheminsUser = os.environ["PATH"].split(os.pathsep)
        RepProg = [ directory for directory in CheminsUser if os.path.isfile(directory + Separateur + NomProg) ]
        return RepProg
    Petit edit : Et au final un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def which(NomProg, Separateur):
    Pour en faire une locale (j'utilise Separateur dans d'autres fonctions.)

  10. #10
    Membre Expert 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
    Par défaut
    Du coup avec un from sys import argv et un NomProg = argv[1] nous voici avec un which sous windows...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C:\>which notepas.exe
    Pas dans le Path
     
    C:\>which notepad.exe
    C:\WINDOWS\system32\notepad.exe
    La magie de Python

  11. #11
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Avec une list comprehension, tu vas d'office parcourir l'intégralité des dossiers, ce qui n'est souvent pas nécessaire.
    Alors même si tu gagneras un tout petit peu au niveau du temps d'exécution processeur, l'accès disque est lent, lent, lent, lent, lent, parce qu'il passe par l'os, requiert un changement de contexte (utilisateur / os) plus un accès disque et tout ce que ça implique.
    Et d'ailleurs ce n'est même pas sur que tu gagnes du temps sur le processeur, ce serait même l'inverse. Ca te force à faire deux fois la concaténation pour le chemin, à faire surement plus d'itérations qu'il n'est nécessaire, et en plus à effectuer ces context switching.

    En plus, on attend comme résultat un chemin vers un fichier... pourquoi donner une liste ? Ca complique le code appelant inutilement.

    Enfin, je trouve important de lever une exception plutôt que de renvoyer, par exemple, une string vide, puisque ça force à prendre en compte la possibilité que l'executable n'existe pas. C'est une source d'erreur en moins.

  12. #12
    Membre Expert 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
    Par défaut
    Bien vu tout cela.
    Merci pour les réponses.

  13. #13
    Membre Expert 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
    Par défaut
    De mon coté j'ai ma réponse mais si cela intéressé quelqu'un voici un code à voir.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacement du File System Object ?
    Par Zebulon777 dans le forum Général JavaScript
    Réponses: 30
    Dernier message: 10/12/2014, 11h04
  2. Réponses: 5
    Dernier message: 24/05/2006, 15h41
  3. Remplacement d'un fichier systeme
    Par soufienne dans le forum Windows XP
    Réponses: 7
    Dernier message: 07/02/2006, 18h05
  4. [Système][Runtime]J'arrive pas à lancer une appli externe !?!
    Par polnioumane dans le forum Général Java
    Réponses: 6
    Dernier message: 16/11/2005, 18h55
  5. [Appli Console]Pb exec command ac fct system(const char *)
    Par Le_magicien999 dans le forum MFC
    Réponses: 2
    Dernier message: 16/08/2005, 16h07

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