【问题标题】:sys.argv[1] IndexError: list index out of rangesys.argv[1] IndexError: 列表索引超出范围
【发布时间】:2016-08-12 08:56:06
【问题描述】:

我正在编写一个 Python HTTP 客户端。 当我有下面的代码时,我从终端“列表索引超出范围”收到一条错误消息。

from socket import *
import sys

server_host = sys.argv[1]
server_port = sys.argv[2]
filename = sys.argv[3]

host_port = "%s:%s" %(server_host, server_port)
try:
    clientSocket = socket(AF_INET,SOCK_STREAM)
    clientSocket.connect((server_host,int(server_port)))
    header = {
    "first_header" : "GET /%s HTTP/1.1" %(filename),
    "Host": host_port,
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US",
    }
    httpHeader = "\r\n".join("%s:%s" %(item,header[item]) for item in     header)
    print httpHeader
    clientSocket.send("%s\r\n\r\n" %(httpHeader))

except IOError:

    sys.exit(1)
final = ""
responseMessage = clientSocket.recv(1024)
while responseMessage:
    final += responseMessage
    responseMssage = clientSocket.recv(1024)

clientSocket.close()
print "final:",final

我从命令行输入

运行程序
python ./client.py http://127.0.0.1 7000 HelloWorld.html

谁能告诉我我的代码有什么问题?提前致谢。

【问题讨论】:

  • 我看不出这有什么问题。尝试像这样执行它: ./client.py 127.0.0.1 7000 HelloWorld.html
  • 你可以调试你的代码,不是吗?只需打印出sys.argv 看看发生了什么
  • @haifzhan 我认为这是脚本的名称。
  • 你能用行号打印出确切的错误吗?信息
  • 我复制了前 5 行代码,但无法重现。

标签: python python-2.7 command-line httpclient


【解决方案1】:

为什么不使用argparse 而不是手动处理 sys.argv?例如:

import argparse as ap

def argParse():
    parser=ap.ArgumentParser(description='Script to do something')
    parser.add_argument("host", help="web address")
    parser.add_argument("port", help="port to connect on")
    parser.add_argument("filename",help="page to use")
    return parser.parse_args()

然后在main函数中调用:

args=argParse()

然后您可以在代码中使用args.hostargs.portargs.filename,argparse 将处理缺少的参数及其类型等。您可以通过在@ 中的定义前面添加-- 来使用可选参数987654328@电话。

您使用 argparse 的代码:

from socket import *
import argparse as ap

def argParse():
    parser=ap.ArgumentParser(description='Script to do something')
    parser.add_argument("host", help="web address")
    parser.add_argument("port", type=int, help="port to connect on")
    parser.add_argument("filename",help="page to use")
    return parser.parse_args()

args=argParse()

host_port = "%s:%d" % (args.host, args.port)
try:
    clientSocket = socket(AF_INET,SOCK_STREAM)
    clientSocket.connect((args.host,args.port))
    header = {
    "first_header" : "GET /%s HTTP/1.1" % (args.filename),
    "Host": str(args.port),
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US",
    }
    httpHeader = "\r\n".join("%s:%s" %(item,header[item]) for item in     header)
    print httpHeader
    clientSocket.send("%s\r\n\r\n" %(httpHeader))

except IOError:

    sys.exit(1)
final = ""
responseMessage = clientSocket.recv(1024)
while responseMessage:
    final += responseMessage
    responseMssage = clientSocket.recv(1024)

clientSocket.close()
print "final:",final

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多