p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 145
    Points : 75
    Points
    75

    Par défaut Problème avec des boucles while/for imbriquées

    Bonjour à tous,

    Débutant sur python depuis quelques semaines, je cherche à faire deux boucles imbriquées (structure commune dans pleins de langages) pour avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    count = 0
     
    while count < max:
        process = subprocess.Popen(...génération d''un fichier texte temporaire)
        process.wait()
     
        for line in (fichier texte temporaire):
             if "texte précis" in (ligne du fichier temporaire):
                   (récupérer infos du fichier temporaire)
    Malheureusement, ça ne marque pas, malgré le respect de l'indentation: les deux loops marchent de façon séparées (le while est terminé, puis il fait le for).

    Existe-t-il un moyen de faire des boucles imbriquées?

    Merci d'avance,

    Nicolas

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 677
    Points : 10 286
    Points
    10 286

    Par défaut

    Salut,
    Existe-t-il un moyen de faire des boucles imbriquées?
    La construction que vous proposez devrait fonctionner.
    S'il y a problème, c'est dans votre code mais vous n'en montrez pas assez pour qu'on puisse vous dire quoi que ce soit.
    Plutôt que de poster l'ensemble de votre code, essayez de le réduire pour reproduire le problème "simplement"
    - W
    Architectures Post-Modernes

  3. #3
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 145
    Points : 75
    Points
    75

    Par défaut

    ok


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    max = len(content)
     
    print(max)
     
    open("results.txt","w").close
     
    #Results.txt est le fichier où on va récuperer les données des logs temporaires
    fresults = open("results.txt","a")
     
     
    count = 0
    while count < max:
        element= r"" + content[count].strip()
     
        parameter1= " -log=C:\\IT_PROJECTS\\out.txt"
     
        count = count+1
     
        wholeCommand = command1 + main_path_1 + element + parameter1
     
        print(element)
    # Commande MS-DOS qui génère un log temporaire où l'on va récupérer ensuite des données
        process = subprocess.Popen(wholeCommand1, stdin=None, stdout=subprocess.PIPE, stderr= subprocess.STDOUT, shell=True)
        process.wait()
     
        fcurrent = open("out.txt","r")
        strfound = False
        lines = fcurrent.readlines()
     
    #Récupération des données sur results.txt venant du log temporaire à partir de la reconnaissance d'un champ
        for line in range(0,len(lines)):
            if "Texte précis" in lines[line]:
                strfound = True
                nextline = lines[line+1]
            if strfound:
                fresults.write("Donnée " + str(line) +" " + nextline)
     
     
        fcurrent.close
     
     
    fresults.close()
    Le résultat est que je récupère les données du premier log à chaque itération.

  4. #4
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 677
    Points : 10 286
    Points
    10 286

    Par défaut

    Salut,

    Le résultat est que je récupère les données du premier log à chaque itération.
    Vous ne fournissez pas un reproducteur mais juste plus de code.
    Donc plus de questions:

    Qu'est ce qui assure que le fichier ouvert par "open" est celui qui a été crée par la commande exécutée par Popen?
    Est-ce que Popen créera des fichiers au contenu différents?
    Pourquoi prendre la précaution de donner un nom de chemin absolu dans un cas et pas dans l'autre?

    Pourquoi ne pas créer une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def dump_element(count):
        element= r"" + content[count].strip()
        fname = "C:\\IT_PROJECTS\\out-%d.txt" % count
        parameter1= " -log=%s" % fname
        wholeCommand = command1 + main_path_1 + element + parameter1
        process = subprocess.Popen(wholeCommand1, stdin=None, stdout=subprocess.PIPE, stderr= subprocess.STDOUT, shell=True)
        process.wait()
        return fname
    Puis dans le while:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for count in range(max):
        fname = dump_element(count)
        fcurrent = open(fname,"r")
        ...
    Cela vous permettrait de vous assurer que les différents fichiers crées sont bien différents.

    - W
    Architectures Post-Modernes

  5. #5
    Expert Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    2 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 2 387
    Points : 3 638
    Points
    3 638

    Par défaut

    Ce code contient des éléments qui ne nous permettent pas de le tester.

    Un exemple simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import subprocess
    a = 0
    while a < 3:
        sb = subprocess.Popen(["echo", "hello"])
        sb.wait()
     
        for i in range(3):
            print i
     
        a += 1
    Ce qui montre que cette structure répond aux attentes.

    Placez quelques autres print dans votre code pour voir ce qui s'y passe.

  6. #6
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 145
    Points : 75
    Points
    75

    Par défaut

    Merci pour le conseil: j'ai utilisé des print et j'ai réussi à detecter l'erreur:
    Il s'agit du popen, qui ne remplace pas le fichier généré par le programme.
    En effet, il ajoute une extension avec un numéro différent pour chaque nouvelle itération:
    par exemple "out.txt_1268"

    Sauriez vous comment utiliser le même fichier "out.txt"?

    C'est peut-être un problème d'accès en lecture..

  7. #7
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 677
    Points : 10 286
    Points
    10 286

    Par défaut

    Citation Envoyé par Nico820 Voir le message
    Il s'agit du popen, qui ne remplace pas le fichier généré par le programme.
    En effet, il ajoute une extension avec un numéro différent pour chaque nouvelle itération:
    par exemple "out.txt_1268"
    Popen ne sait pas quelle commande on lui demande de lancer et encore moins que celle-ci créer un fichier.
    Regardez plutôt du côté de celle-ci.
    Au pire, détruire le fichier après l'avoir traité pourrait suffire.
    - W
    Architectures Post-Modernes

  8. #8
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 145
    Points : 75
    Points
    75

    Par défaut

    Ou alors c'est au niveau du flux de sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        process = subprocess.Popen(wholeCommand1, stdin=None, stdout=subprocess.PIPE, stderr= subprocess.STDOUT, shell = true)
        process.wait()
    en effet, on ne peut plus supprimer le fichier car il est réservé par un autre process..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PermissionError: [WinError 32] Le processus ne peut pas accéder au fichier car c
    e fichier est utilisé par un autre processus: 'C:\\IT_PROJECTS\\out.txt'
    Si je lance la commande sous dos, il n'y a pas de problème

  9. #9
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 145
    Points : 75
    Points
    75

    Par défaut

    autre élément de réponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WARNING: Impossible to rename [C:\IT_PROJECTS\out.txt_2996] into [C:\IT_PR
    OJECTS\out.txt]
    J'ai essayé le "process.kill()", et ça ne marche pas.

  10. #10
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 677
    Points : 10 286
    Points
    10 286

    Par défaut

    Salut,
    Tous les soucis que vous avez n'ont rien avoir avec Python mais sont liés à l'utilisation du programme que vous lancez avec Popen.
    - W
    Architectures Post-Modernes

  11. #11
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 145
    Points : 75
    Points
    75

    Par défaut

    j'ai fait le test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fcurrent.close()
    print("Fermé? " + str(fcurrent.closed()))
    et ça retourne "false"

    Pourtant lorsque je lance la commande sous dos (avec presque pas de pause entre les deux), ça écrase l'ancien fichier.

    Là je mets 5 secondes (sleep(5)) entre les process sous python et impossible de fermer le fichier

  12. #12
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 677
    Points : 10 286
    Points
    10 286

    Par défaut

    Citation Envoyé par Nico820 Voir le message
    j'ai fait le test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fcurrent.close()
    print("Fermé? " + str(fcurrent.closed()))
    et ça retourne "false"
    .closed étant un attribut et pas une fonction, le code que vous montrez ne fonctionne pas à cause des () après fcurrent.closed.
    Impossible de savoir ce que vous avez testé.
    Bon courage,
    - W
    Architectures Post-Modernes

  13. #13
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 145
    Points : 75
    Points
    75

    Par défaut

    En effet, j'avais à la fin du code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        fcurrent.close
     
     
    fresults.close()
    bref, tout ça à cause de deux parenthèse oubliés

    Merci beaucoup

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

Discussions similaires

  1. Problème avec ma boucle while
    Par gautgaut dans le forum Débuter
    Réponses: 7
    Dernier message: 09/07/2013, 18h04
  2. Problème avec deux boucles do whiles imbriquées
    Par breizh297 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/11/2010, 08h37
  3. problème avec n boucles FOR imbriquées
    Par neopi21 dans le forum Général Java
    Réponses: 9
    Dernier message: 09/06/2009, 10h36
  4. Réponses: 3
    Dernier message: 24/05/2007, 17h56
  5. Réponses: 2
    Dernier message: 29/08/2006, 13h59

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