IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Erreur] TypeError: 'str' does not support the buffer interface


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [Erreur] TypeError: 'str' does not support the buffer interface
    Bonjour,

    Je suis néophyte en Python et j'ai commencé à faire un programme utilisant les sockets pour communiquer avec un serveur.

    Lorsque je lance le programme, je fais l'authentification et lorsque par exemple je veux lancer la commande " shutdown " ou même annonce, j'obtiens l'erreur : " TypeError: 'str' does not support the buffer interface "

    Sans plus attendre, voici le code :

    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
    import os
    import socket
     
    i = 1
     
    login = input("Connexion : ")
     
    if(login != 'holox'):
    	print("Mot de passe incorrect !")
    else:
    	print("Connexion reussie !")
    	while i == 1:
     
    		addrIP = "127.0.0.1"
    		port = 30001
     
    		def sendSocket(command, data):
    			connexionPrincipal = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    			connexionPrincipal.connect((addrIP, port))
    			socket_X = command + chr(1) + data
    			connexionPrincipal.send(socket_X)
    			connexionPrincipal.close()
     
    		commande = input("Qu'est ce que vous voulez faire ?")
    		if commande == "shutdown":
    			sendSocket("shutdown", "")
    			print("Serveur eteint")
    		elif commande == "reloadbans":
    			sendSocket("reloadbans", "")
    			print("Les bans sont reloads")
    		elif commande == "ha":
    			annonce = input("Quelle est l'annonce que vous voulez passer ?")
    			sendSocket('ha', str(annonce))
    			print("Annonce envoyee !")
     
    		else:
    			print("Commande incorrect !")
     
    os.system("pause")

    Voila, le code n'est peut-être pas très propre, mais je verrais pour l'optimiser lorsque j'aurais un peu plus de connaissances. Le but pour l'instant reste de faire un script fonctionnel.


    Merci d'avance,
    Au revoir.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Salut,
    Les sockets permettent d’échanger des /bytes/ alors qu'une chaîne de caractères Python /str/ est, par défaut depuis la version 3, de l'Unicode.
    Essayez d’écrire sendSocket(b"shutdown", b""), ça devrait aller mieux.
    A vous de voir, si pour la suite, il sera préférable de travailler "partout" avec des /bytes/ ou de convertir /bytes/ en /str/ via les méthode .decode et .encode.
    Le plus simple sera quand même de pousser les conversions dans des primitives de bas-niveau pour avoir quelque chose d’homogène en /str/ plus haut.

    Il faut aussi revoir le sens de "stream-socket": TCP vous garantit que les bytes seront reçus dans leur ordre d’expédition mais en sait pas ce qu'est une "commande". Dit autrement, a, b, c, d seront reçus dans l'ordre mais les lectures pourront retourner "a", "ab", "abc" ou "ab" puis "cd"...
    Pour s'en sortir, on peut expédier des message de longueur fixe ou les préfixer par une longueur ou les terminer par <CRLF> comme la plupart des protocoles internet (ca permet de tester a la console).

    Bon courage,
    - W

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Lorsque j'applique votre code, cela me donne une autre erreur : " TypeError: Can't concat bytes to str "

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Salut,

    Citation Envoyé par Holox Voir le message
    Lorsque j'applique votre code, cela me donne une autre erreur : " TypeError: Can't concat bytes to str "
    Oui mais a la ligne "socket_X = command + chr(1) + data".
    Car chr(1) est /str/ et ajouter des /bytes/ et des /str/ c'est, pour Python, comme ajouter des /poires/ et des /concombres/.

    Lorsque j’écris:
    A vous de voir, si pour la suite, il sera préférable de travailler "partout" avec des /bytes/ ou de convertir /bytes/ en /str/ via les méthode .decode et .encode.
    C'est pour vous alerter sur le fait que vous êtes en train de vous prendre les pieds sur un sujet qui s'appelle sérialiser/de-sérialiser des /bytes/ en /str/.
    Comme vous êtes néophyte en Python, c'est l'occasion d'aller lire la documentation, de faire quelques tests pour vous assurer d'avoir compris, d’évaluer les implications de tout ça sur le design de votre code et de les mettre en œuvre.

    A défaut, lorsque mettez une rustine ici, le truc ira péter plus loin.
    Normal.

    - W

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Je vous remercie beaucoup de votre aide, mais j'ai finalement trouvé, cela ne marchait plus depuis que je suis passé en 3.4 j'ai donc downgrade en 2.7 et cela remarche.

    Merci d'avance,
    Au revoir.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Citation Envoyé par Holox Voir le message
    Je vous remercie beaucoup de votre aide, mais j'ai finalement trouvé, cela ne marchait plus depuis que je suis passé en 3.4 j'ai donc downgrade en 2.7 et cela remarche.
    En 2.7, /str/ ("Connexion reussie !" est /str/) sera par défaut /bytes/.
    Et tant que vos chaînes de caractères seront "ASCII", ça fonctionnera.
    Le jour ou vous devrez sortir de cette zone de confort, ça va aussi péter.
    Et vous avez du vous en rendre compte en écrivant "réussie".

    Python3 a été, en partie, construit pour que ces cas soient plus simples a traiter, revenir en arrière est un mauvais choix.

    Mais comme vous êtes jeune, vous avez plein de temps a perdre. C'est donc sans importance - c'est votre temps.
    - W

  7. #7
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    J'aurais bien voulu faire ça plus proprement, mais même avec vos explications je ne comprends pas comment faire ...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Salut,
    Citation Envoyé par Holox Voir le message
    J'aurais bien voulu faire ça plus proprement, mais même avec vos explications je ne comprends pas comment faire ...
    Python est un langage de programmation qui permet au non informaticiens et aux débutants de pondre de petits codes qui fonctionnent sans trop se prendre le chou a savoir pourquoi.
    L'important étant de se faire plaisir et, éventuellement, entretenir la motivation de découvrir cette planète étrange qu'est le monde de l'informatique.

    Si vous voulez progresser de façon plus structurée, il y a plein de tutos pour commencer. La programmation d'interfaces graphiques avec Tkinter est un bon moyen pour s'initier a gérer la complexité et structurer son code avec des trucs qu'on voit.

    Bon courage
    - W

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

Discussions similaires

  1. TypeError: 'str' does not support the buffer interface
    Par Thomas404 dans le forum Général Python
    Réponses: 13
    Dernier message: 18/09/2012, 20h29
  2. Réponses: 7
    Dernier message: 09/08/2011, 19h57
  3. Réponses: 3
    Dernier message: 29/04/2011, 11h32
  4. Réponses: 0
    Dernier message: 25/04/2010, 02h27
  5. Réponses: 1
    Dernier message: 06/03/2008, 20h24

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