Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 13 sur 13
  1. #1
    Membre du Club
    Profil pro Nicolas
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Nom : Nicolas
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 131
    Points : 69
    Points
    69

    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 :
    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
    5 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 465
    Points : 8 261
    Points
    8 261

    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 du Club
    Profil pro Nicolas
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Nom : Nicolas
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 131
    Points : 69
    Points
    69

    Par défaut

    ok


    Code :
    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
    5 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 465
    Points : 8 261
    Points
    8 261

    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 :
    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 :
    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
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 883
    Points : 2 895
    Points
    2 895

    Par défaut

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

    Un exemple simple:
    Code :
    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.
    Vincent
    Oqapy . Qarte . PaQager

  6. #6
    Membre du Club
    Profil pro Nicolas
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Nom : Nicolas
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 131
    Points : 69
    Points
    69

    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
    5 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 465
    Points : 8 261
    Points
    8 261

    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 du Club
    Profil pro Nicolas
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Nom : Nicolas
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 131
    Points : 69
    Points
    69

    Par défaut

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

    Code :
    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 :
    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 du Club
    Profil pro Nicolas
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Nom : Nicolas
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 131
    Points : 69
    Points
    69

    Par défaut

    autre élément de réponse:

    Code :
    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
    5 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 465
    Points : 8 261
    Points
    8 261

    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 du Club
    Profil pro Nicolas
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Nom : Nicolas
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 131
    Points : 69
    Points
    69

    Par défaut

    j'ai fait le test

    Code :
    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
    5 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 465
    Points : 8 261
    Points
    8 261

    Par défaut

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

    Code :
    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 du Club
    Profil pro Nicolas
    Ingénieur développement logiciels
    Inscrit en
    décembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Nom : Nicolas
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 131
    Points : 69
    Points
    69

    Par défaut

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


    Code :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •