首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

,sys.argv[1:]的有关问题

2013-05-02 
求助,sys.argv[1:]的问题各位好!练习python的时候,发现这么一段代码会报错:host, port sys.argv[1:]# Lo

求助,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中如何获得并处理命令行参数



[解决办法]
引用:
我没看错的话,是因为你:
使用sys.arg的时候,传入的值port值:
80
实际上是个字符串
因为sys.arg传入的内容,没有经过解析的话,都是普通的字符串
所以此处80,其实就是"80",而不是int值80

而你通过代码赋值


Python code
?



1

port = 80
才是真正的,int类型的80.
所以解决办法:


Py……

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 。

热点排行