Boucle while True bloquée
bob12345
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je débute en python et je rencontre un problème que je n'arrive pas à résoudre. Voici mon code:
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.
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:
- While true python francais
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Acronis true image - Télécharger - Sauvegarde
- Dernière version ccleaner gratuit français - Télécharger - Nettoyage
- Télécharger adobe reader 9.1 français gratuit - Télécharger - PDF
- Fixwin 11 en français - Télécharger - Divers Utilitaires
2 réponses
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.
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.
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
as-tu ajouté des print() afin de déterminer à quel endroit le programme était "bloqué"?
as-tu ajouté des print() afin de déterminer à quel endroit le programme était "bloqué"?
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.
EDIT: Je viens d'essayer un autre solution, elle ne marche pas, mais elle me donne certaines réponse:
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:
EDIT 2: Peut être que l'émetteur envoie tous les messages car j'utilisais "s.sendall" au lieu de "send".
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".
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.
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.