Python 3 TypeError: impossible de convertir l'objet "octets" en str implicitement
Conversion d'un exemple de socket Python 2 en Python 3
whois.py
import sys
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("whois.arin.net", 43))
s.send((sys.argv[1] + "\r\n").encode())
response = ""
while True:
data = s.recv(4096)
response += data
if not data:
break
s.close()
print(response)
Si la compilation avec Python 3, il invite l'erreur suivante?
Traceback (most recent call last): File "C:\repos\hc\whois\python\whois.py", line 12, inresponse += data TypeError: Can't convert 'bytes' object to str implicitly
Solution
En Python 3, le socket renvoie les données sous forme debytes (il s'agissait destring en Python 2). Comme la réponse est unstring, vous ne pouvez pas ajouter directement deux types différents (bytes + string). To fix it, vous devez convertir le type:
#Solution 1 Convertit la réponse destring to bytes
whois.py
import sys
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("whois.arin.net", 43))
s.send((sys.argv[1] + "\r\n").encode())
#Convert response to bytes
response = b""
# or use encode()
#response = "".encode()
while True:
data = s.recv(4096)
response += data
if not data:
break
s.close()
print(response.decode())
#Solution 2 Convertit les données debytes to string
whois.py
import sys
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("whois.arin.net", 43))
s.send((sys.argv[1] + "\r\n").encode())
response = ""
while True:
data = s.recv(4096)
#convert data from bytes to string
#response += data
response += data.decode()
if not data:
break
s.close()
print(response)