Python 3 TypeError: Das Objekt "bytes" kann nicht implizit in str konvertiert werden
Konvertieren eines Python 2-Socket-Beispiels in 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)
Wenn Sie mit Python 3 kompilieren, wird der folgende Fehler angezeigt?
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
Lösung
In Python 3 gibt der Socket Daten alsbytes zurück (in Python 2 waren esstring). Da die Antwortstring ist, können Sie nicht zwei verschiedene Typen (bytes + string) direkt hinzufügen. To fix it müssen Sie den Typ konvertieren:
#Lösung 1 Konvertieren Sie die Antwort vonstring 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())
#Lösung 2 Konvertieren Sie die Daten vonbytes 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)