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: a bytes-like object is required, not 'str'


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut Erreur TypeError: a bytes-like object is required, not 'str'
    Bonjour, voila je voudrais savoir comment faire pour éviter cette erreur.

    Sur Linux j'aoute cela # -*- coding: Utf-8 -*- en entete et ca marche
    par contre sur windows avec IDLE python 3.5.2 sur windows je suis oblige d'ajouter encode(encoding='utf_8') ça enlève l'erreur
    ne peut pas encoder d'une maniere globale comme sur linux
    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
    import socket
    import sys
    import time
     
    server = "irc.toto.org"       
     
     
    irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    print ("connecting to:"+server)
     
    irc.connect((server, 6667)) #connects to the server
    irc.send(("USER "+ toto+" "+ toto+" "+ toto+" \n").encode(encoding='utf_8')) #user authentication
    irc.send(("NICK "+ totoo+"\n").encode(encoding='utf_8')) #sets nick
    ...
    ...
    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par djbad Voir le message
    Sur Linux j'aoute cela # -*- coding: Utf-8 -*- en entete et ca marche
    par contre sur windows avec IDLE python 3.5.2 sur windows je suis oblige d'ajouter
    A priori, en changeant d'OS, vous avez aussi changé de version de Python.
    En tous cas, c'est la première chose à vérifier.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    Oui je sais que ce n'est pas les versions.
    Mais le but de ma question est de savoir comment peut on faire pour éviter l'erreur de type str sur Windows sans tapez encode utf8 à chaque paramètre.
    Mais je te remercie quand même

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Bonsoir,

    Est-ce que vous êtes certain que la version Python sous linux est bien en version 3.x ?

    Parce que la documentation de la méthode send stipule bien que l'argument data soit en bytes :
    socket.send(bytes[, flags])

    Qui sous la version 2 (comme la plupart des méthodes sous cette version) requiert du type string :

    socket.send(string[, flags])

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Citation Envoyé par djbad Voir le message
    Mais le but de ma question est de savoir comment peut on faire pour éviter l'erreur de type str sur Windows sans tapez encode utf8 à chaque paramètre.
    Vous pouvez déjà écrire tout ce qui est en dur en bytes avec la syntaxe b"mon texte"
    ce qui permet d’additionner comme entre objets string sans devoir encoder un par un :


    irc.send(b"USER " + toto)

    toto étant bien évidemment déjà encodé avant.

    Le mieux plutôt que de réécrire 50 fois irc.send et c'est faire une méthode/fonction au dessus qui va systématiquement encoder et par la même occasion rajouter les caractères de terminaisons par exemple.

    Voici un exemple en passant par une classe :

    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
    def _ask(self, command: str) -> str: # {
            """Send command on serial port interface and retrieve answer line
     
            :param str(command): Command to send
            :return: str: Answer from command
            """
            if self._debug_mode: print("Send command:", str(command))
     
            self._serial_port.flushOutput() # Clear output buffer to make sure to sent the last command only
            self._serial_port.flushInput() # Clear input buffer to make sure the answer come from the last command
     
            self._serial_port.write( bytes(str(command) + self._SERIAL_COMMAND_TERMINATION, self._SERIAL_ENCODING) )
     
            answer = self._serial_port.readline()
            if self._debug_mode: print("Answer:", answer.decode(self._SERIAL_ENCODING).strip())
     
            return answer.decode(self._SERIAL_ENCODING).strip()
        # } _ask

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    Merci c'est parfait

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

Discussions similaires

  1. [Python 3.X] Comprendre l'erreur TypeError: object of type 'Header' has no len()
    Par jeje3314 dans le forum Général Python
    Réponses: 4
    Dernier message: 22/04/2016, 11h45
  2. Erreur du système ODBC & Business Objects
    Par NeoItalian dans le forum Administration-Migration
    Réponses: 0
    Dernier message: 06/06/2012, 10h04
  3. Erreur servlet hibernate: id to load is required for loading
    Par salma309 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 14/03/2011, 15h26
  4. Réponses: 7
    Dernier message: 29/08/2008, 15h27
  5. Réponses: 1
    Dernier message: 16/07/2008, 16h22

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