Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope
Python & Zope Forum d'entraide sur la programmation en Python et Zope. Avant de poster -> F.A.Q Python
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/12/2012, 09h26   #1
Nico820
Membre du Club
 
Nicolas
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 128
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 : 128
Points : 65
Points : 65
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
Nico820 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 10h03   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 696
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 696
Points : 4 525
Points : 4 525
Salut,
Citation:
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 11h36   #3
Nico820
Membre du Club
 
Nicolas
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 128
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 : 128
Points : 65
Points : 65
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.
Nico820 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 12h07   #4
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 696
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 696
Points : 4 525
Points : 4 525
Salut,

Citation:
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 12h14   #5
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
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
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 14h44   #6
Nico820
Membre du Club
 
Nicolas
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 128
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 : 128
Points : 65
Points : 65
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..
Nico820 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 15h03   #7
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 696
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 696
Points : 4 525
Points : 4 525
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 15h26   #8
Nico820
Membre du Club
 
Nicolas
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 128
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 : 128
Points : 65
Points : 65
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
Nico820 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 15h38   #9
Nico820
Membre du Club
 
Nicolas
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 128
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 : 128
Points : 65
Points : 65
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.
Nico820 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 15h48   #10
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 696
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 696
Points : 4 525
Points : 4 525
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 16h00   #11
Nico820
Membre du Club
 
Nicolas
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 128
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 : 128
Points : 65
Points : 65
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
Nico820 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 16h14   #12
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 696
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 696
Points : 4 525
Points : 4 525
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 16h24   #13
Nico820
Membre du Club
 
Nicolas
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 128
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 : 128
Points : 65
Points : 65
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
Nico820 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h49.


 
 
 
 
Partenaires

Hébergement Web