Boucle while True bloquée

Fermé
bob12345 - 20 avril 2022 à 17:05
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 - 21 avril 2022 à 13:47
Bonjour,

je débute en python et je rencontre un problème que je n'arrive pas à résoudre. Voici mon code:

 
with open(os.path.join(save_path, filename), "wb") as file_to_write:
    while True:
        dat = conn.recv(1024)
        if not dat:
            break
        file_to_write.write(dat)
    file_to_write.close()


J'utilise socket pour recevoir des données et les écrire dans un fichier, tout se passe bien et je les reçois, mais dès que mon autre programme arrête d'envoyer, ma boucle semble ne pas s'arrêter et je n'ai aucun message d'erreur, juste du "vide" dans le terminal où je ne peux pas écrire. J'ai essayé plein d'autres alternatives pour le "if...break" mais ça ne marchait toujours pas. Je tiens à préciser que l'autre programme n'a aucun problème et qu'il fonctionne comme je le souhaite.

Est-ce que j'ai fait une erreur de logique ou plutôt syntaxique?

Merci d'avance pour vos réponses.
A voir également:

2 réponses

jee pee Messages postés 40470 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 23 novembre 2024 9 427
20 avril 2022 à 17:13
Bonjour,

Je ne connais pas ces process sous python. Mais il semble logique que ton programme attende de recevoir quelque chose. Pour y mettre fin, soit il faudrait un timeout sur réception, soit que l’émetteur envoie un message de fin de communication.
0
Bonjour,
Je vais essayer de mettre en place le timeout quand j'en aurais la possibilité et vous tiendrais au courant.
Merci de votre réponse.
0
Ca n'a malheureusement pas marché, je pense que je vais revoir entièrement mon code et le refaire.
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550 > bob12345
21 avril 2022 à 09:19
qu'as-tu essayé?
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550
21 avril 2022 à 09:20
L'émetteur pourrait aussi se terminer, ce qui fermerait le socket.
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
21 avril 2022 à 09:17
bonjour,
as-tu ajouté des print() afin de déterminer à quel endroit le programme était "bloqué"?
0
Oui j'ai essayé, il se bloque après la dernière ligne de la boucle. J'ai mis une autre condition pour voir si ça se débloque. L'émetteur envoi "stop' et la boucle est sensée s'arrêter si elle le reçoit. Mais même avec ça, elle reste bloquée. L'émetteur ne termine pas la connection, il fonctionne comme prévu: il envoie les données, puis envoie le stop et il lance une autre fonction.
0
EDIT: Je viens d'essayer un autre solution, elle ne marche pas, mais elle me donne certaines réponse:

with open(os.path.join(save_path, filename), "wb") as file_to_write:

        sizee = int("".join(map(chr, conn.recv(1024)))) #nombre de bytes à recevoir
        reciby = 0 #bytes reçus
        while reciby < sizee:
            dat = conn.recv(1024)
            file_to_write.write(dat)
            print("1") #Un print pour voir le comportement de la boucle
            reciby = reciby+1
        
            
    file_to_write.close()



Ce bout de code me donne une erreur car "8textstop" n'est pas un nombre. 8 est le nombre de bytes, text est le contenu du fichier txt que je veux envoyer et stop est le "stop". A ce stade je ne comprends plus rien, Je vais aussi mettre le code de l'émetteur pour que vous puissiez voir:


#émetteur
reqFile = s.recv(1024)
    reqfile = "".join(map(chr, reqFile))
    size = os.path.getsize(reqfile)
    sized = str(size)
    s.send(sized.encode())
    with open(reqfile, "rb") as file_to_send:
        for data in file_to_send:
            s.send(data) #J'utilisais s.sendall ici
    s.send("stop".encode())
            
   

    print("sent")



EDIT 2: Peut être que l'émetteur envoie tous les messages car j'utilisais "s.sendall" au lieu de "send".
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550 > bob12345
21 avril 2022 à 12:44
Il me semble que ton message est foireux.
Au lieu de
8textstop
, j'enverrais
4.text
.
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550 > bob12345
21 avril 2022 à 12:46
je pense que tu n'as pas mis assez de print().
dans quelle instruction se bloque-t-il?
0
bob12345 > yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024
21 avril 2022 à 12:55
En fait le problème c'est que il n'est pas censé envoyer "8textstop ". Il doit envoyer 8 puis texte et stop. Mais bon de toute façon je vais le refaire entièrement si j'en ai le temps, ça m'a prit 2 jours et je ne peux pas me permettre de consacrer plus de temps à le faire. En tout cas, je vous remercie pour vos réponses.
0