Python 2ソケットの例を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)
Python 3でコンパイルすると、次のエラーメッセージが表示されますか?
Traceback (most recent call last):
File "C:\repos\hc\whois\python\whois.py", line 12, in <module>
response += data
TypeError: Can't convert 'bytes' object to str implicitly
解決策
Python 3では、ソケットはデータを
bytes
(Python 2では` string`でした)として返します。応答は
string`なので、2つの異なる型(
bytes string`)を直接追加することはできません。 ** それを修正するには、タイプを変換する必要があります:
#Solution 1レスポンスを `stringから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データを
bytesから
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)
参考文献
-
https://docs.python.org/3/library/stdtypes.html
[Python 3ビルトイン
タイプ]。リンク://python/python-whois-client-example/[Python Whois client
例]