求助,sys.argv[1:]的问题
各位好!
练习python的时候,发现这么一段代码会报错:
host, port = sys.argv[1:]
# Look up the given data
results = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)
报错信息:
socket.gaierror: [Errno -2] Name or service not known
修改成这样就ok了:
host = "www.baidu.com"
port = 80
# Look up the given data
results = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)
请问这是为什么?使用 host, port = sys.argv[1:] 难道不合理吗?
谢谢各位!
[解决办法]
如果argv个数为1怎么办?
[解决办法]
sys.argv[1:]的类型为list
而等号左边的host,port默认是tuple,类型不匹配,需转换成tuple
import sys
if sys.argv != 3:
print 'argument number must be 3'
sys.exit(1)
host,port = tuple(sys.argv[1:])
[解决办法]
试试print repr(host), repr(port)看看有没有多余不可显示的字符跑进去...
[解决办法]
本人使用楼主的代码:
# test.py
import sys
import socket
if __name__=='__main__':
host, port = sys.argv[1:] # Look up the given data
results = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)
print results
在命令行执行test.py www.baidu.com 80
运行正常,结果显示[(2, 1, 0, '', ('220.181.111.147', 80))]
请楼主检查,是否与你操作一样。
[解决办法]
我的环境是python 2.7.3
[解决办法]
我没看错的话,是因为你:
使用sys.arg的时候,传入的值port值:
80
实际上是个字符串
因为sys.arg传入的内容,没有经过解析的话,都是普通的字符串
所以此处80,其实就是"80",而不是int值80
而你通过代码赋值
port = 80
才是真正的,int类型的80.
所以解决办法:
host, port = sys.argv[1:]
之后,
用
port=int(port)
把"80"转为80.
应该就可以了。
注:
其实,用sys.arg直接获得输入参数,本身就不是个好做法,建议用专门的参数处理的库:
(旧的)optparse或(新的)argparse
详见:
【整理】Python中如何获得并处理命令行参数
[解决办法]
getaddrinfo( host, port[, family[, socktype[, proto[, flags]]]])
Resolves the host/port argument, into a sequence of 5-tuples that contain all the necessary argument for the sockets manipulation. host is a domain name, a string representation of IPv4/v6 address or None. port is a string service name (like 'http'), a numeric port number or None.
当你穿字符串进去的是后会解析成service name 。