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 :

S'arrêter à une seule occurrence dans une liste comprehension


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Par défaut S'arrêter à une seule occurrence dans une liste comprehension
    Bonjour ,

    Je suis en train de coder une petite application. Dans son utilisation sous windows, je dois passer par un .exe pour faire fonctionner une partie du log.

    Dans la partie qui m'amène ici, je dois détecter les lecteurs disponibles (je passe par psutil), après je dois détecter sur les lecteurs présents la présence de wkhtmltopdf.exe et déterminer les chemins ...

    Ca fonctionne mais c'est hyper long ! ... pour remédier à ça je voudrais qu'au 1er chemin trouvé, dans tous les cas, les boucles s'arrêtent (pour ne collecter qu'un seul chemin).

    Voilà mon code :

    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
    import psutil, os
     
    ll = [p2[p1] for p1, p2 in enumerate(psutil.disk_partitions())]
     
    liste_exe_wkhtmltopdf = [os.path.join(chem_parent, nom) for part in ll for chem_parent, sous_reps, fichiers in os.walk(part) for nom in fichiers if os.path.isfile(os.path.join(chem_parent, nom)) and "wkhtmltopdf.exe" in os.path.join(chem_parent, nom)]
     
    print(liste_exe_wkhtmltopdf)
     
    """ J'obtiens :
     
    ['D:\\wkhtmltopdf\\bin\\wkhtmltopdf.exe', 'D:\\cours_arts_plastiques\\Cours_Travaux_a_faire__COLLEGE_NOUVEAUX_PROGRAMMES\\script_python_fiches_eleves_feuilles_evaluation\\projet_ArtP\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe', 'D:\\cours_arts_plastiques\\Cours_Travaux_a_faire__COLLEGE_NOUVEAUX_PROGRAMMES\\script_python_fiches_eleves_feuilles_evaluation\\projet_ArtP\\SAUV\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe', 'D:\\cours_arts_plastiques\\Cours_Travaux_a_faire__COLLEGE_NOUVEAUX_PROGRAMMES\\script_python_fiches_eleves_feuilles_evaluation\\projet_ArtP\\SAUV\\A_dev_pour_version_windows\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe', 'D:\\cours_arts_plastiques\\Cours_Travaux_a_faire__COLLEGE_NOUVEAUX_PROGRAMMES\\script_python_fiches_eleves_feuilles_evaluation\\projet_ArtP\\A_dev_pour_version_windows\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe', 'D:\\projet_ArtP\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe', 'D:\\projet_ArtP_DEV\\A_dev_pour_version_windows\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe', 'D:\\projet_ArtP_DEV\\SAUV\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe', 'D:\\projet_ArtP_DEV\\SAUV\\A_dev_pour_version_windows\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe', 'D:\\projet_ArtP_DEV\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe']
     
    Dans la liste comprehension je voudrais forcer l'arrêt des boucles pour obtenir :
     
    ['D:\\wkhtmltopdf\\bin\\wkhtmltopdf.exe']
     
    ... c'est à dire juste le tout 1er chemin trouvé."""
    Est-ce possible ?, si oui pouvez-vous m'aider ?

    A bientôt.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par ekdmekdm Voir le message
    Est-ce possible ?
    Il doit être possible de lever StopIteration sous une condition quelconque...

    Citation Envoyé par ekdmekdm Voir le message
    si oui pouvez-vous m'aider ?.
    Le résultat sera illisible.
    Et... coder çà avec des boucles "for" simples est bien plus simple.

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

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Il doit être possible de lever StopIteration sous une condition quelconque...

    Le résultat sera illisible.
    Et... coder çà avec des boucles "for" simples est bien plus simple.

    - W
    Salut wiztricks,

    Un exemple ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Citation Envoyé par ekdmekdm Voir le message
    Un exemple ?
    Les exemples de boucle "for" utilisant "break" ou "continue" sont dans tous les bons tutos.

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

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Par défaut
    Re,

    Ca semble bien se profiler sans utilisation d'une liste comprehension et avec un break au bon endroit ... il faudra tout de même que je teste sous windows.

    Désolé pour le bruit ... Merci pour les bons conseils.

    a+

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par ekdmekdm Voir le message
    Désolé pour le bruit ... Merci pour les bons conseils.
    Je ne vois pas trop pourquoi chercher partout cet exécutable là pour ne garder le premier chemin trouvé si ce n'est pas pour l'exécuter.
    Dans ce cas, çà veut dire que votre script en dépend...
    Autant créer un sous répertoire dans le répertoire du script et le recopier dedans: vous saurez où chercher et en plus ce sera a version attendue par votre code.

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

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Je ne vois pas trop pourquoi chercher partout cet exécutable là pour ne garder le premier chemin trouvé si ce n'est pas pour l'exécuter.
    Salut,

    Oui bien sûr c'est pour l'exécuter.

    Dans ce cas, çà veut dire que votre script en dépend...
    Forcément.

    Autant créer un sous répertoire dans le répertoire du script et le recopier dedans: vous saurez où chercher et en plus ce sera a version attendue par votre code.

    - W
    C'est clair que c'est une option ... c'est d'ailleurs comme ça que je faisais au départ dans l'application, wkhtmltopdf était bien intégré dans l'arborescence de mon application (dans ce cas là pas de souci pour le chemin), mais wkhtmltopdf pèse très lourd à lui tout seul (+ de 85 méga).
    Récemmment j'ai crée un petit script pour empaqueter (avec PyInstaller, qui est vraiment bien au passage) mon appli sous windows (et ainsi la distribuer le cas échéant). Mon appli utilise PyQt5, plus d'autres modules, ... à la fin de la compilation avec PyInstaller ça fait assez lourd, si je rajoute wkhtmltopdf ... je rajoute un gros poids en plus ...
    Ce que je me dis est que demander à l'utilisateur de décompresser wkhtmltopdf quelque part sur le dd (et après rechercher le chemin de l'exécutable) n'est pas une mauvaise solution.
    En fait j'utilise le module pdfkit, sous GNU/Linux, le module est installé avec wkhtmltopdf, ce qui n'est pas le cas sous windows (il faut le lui rajouter et lui indiquer le chemin (pdfkit.configuration)).

    Voilà le fin mot de l'histoire. Pour l'instant cette solution me convient, mais s'il y a beaucoup mieux ...

    a+

  8. #8
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    pour reprendre l'idée de départ avec la ligne unique, ce qui prend du temps (et de la mémoire) c'est os.walk() finalement, on doit attendre qu'il ait fini la totalité de son travail pour pondre une liste exhaustive
    or os.walk() est un générateur, donc plutôt que d'utiliser les crochets [...] pour faire une liste en intension, on peut utiliser iter() qui conservera le générateur, et récupérer le premier élément avec next() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> z = iter(os.path.join(chem_parent, nom) for part in ['C:\\', 'D:\\'] for chem_parent, sous_reps, fichiers in os.walk(part) for nom in fichiers if 'wkhtmltopdf.exe' in nom)
    >>> z.next()
    'D:\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'
    >>> z.next()
    'D:\\cours_arts_plastiques\\Cours_Travaux_a_faire__COLLEGE_NOUVEAUX_PROGRAMMES\\script_python_fiches_eleves_feuilles_evaluation\\projet_ArtP\\windows_dependances_portables\\wkhtmltox\\bin\\wkhtmltopdf.exe'

  9. #9
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Par défaut
    @BufferBob

    Salut ,

    Cette solution m'intéresse énormément. Je regarde ça ...

    Merci !

    a+

  10. #10
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) on Windows (64 bits).
    This is the Pyzo interpreter with integrated event loop for PYQT5.
    Type 'help' for help, type '?' for a list of *magic* commands.
     
    >>> import psutil, os
     
    >>> lecteurs = [p2[p1] for p1, p2 in enumerate(psutil.disk_partitions())]
     
    >>> exe_wkhtmltopdf = iter(os.path.join(chem_parent, nom) for part in lecteurs for chem_parent, sous_reps, fichiers in os.walk(part) for nom in fichiers if 'wkhtmltopdf.exe' in nom)
     
    >>> exe_wkhtmltopdf.next()
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
    AttributeError: 'generator' object has no attribute 'next'
    Mince ! ... "Correct, g.next() has been renamed to g.__next__()." (1er lien trouvé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> exe_wkhtmltopdf.__next__()
    'D:\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'
    Super !

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par ekdmekdm Voir le message
    En fait j'utilise le module pdfkit, sous GNU/Linux, le module est installé avec wkhtmltopdf, ce qui n'est pas le cas sous windows (il faut le lui rajouter et lui indiquer le chemin (pdfkit.configuration)).
    Si vous utilisez pdfkit, il cherche déjà wkhtmltopdf que ce soit sur Linux ou Windows lorsqu'on ne le passe pas en paramètre à pdfkit.configuration et vous pouvez récupérez le boulot dans l'attribut wkhtmltopdf de l'instance créée.
    (ou pomper le code qui le fait via which ou where).

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/03/2016, 16h42
  2. Réponses: 6
    Dernier message: 13/11/2009, 17h06
  3. Plusieurs indicateurs d'une meme table dans une seule requete
    Par arnaud.barre dans le forum Débuter
    Réponses: 5
    Dernier message: 12/04/2007, 18h23
  4. Réponses: 11
    Dernier message: 06/12/2005, 09h23

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