Python sys.argv[1]索引器:列表索引超出范围

Python sys.argv[1]索引器:列表索引超出范围,python,python-2.7,command-line,httpclient,Python,Python 2.7,Command Line,Httpclient,我正在编写一个Python HTTP客户端。 当我有下面的代码时,我从终端收到一条错误消息“列表索引超出范围” 我通过键入从命令行运行程序 python ./client.py http://127.0.0.1 7000 HelloWorld.html 有人能告诉我我的代码有什么问题吗?提前感谢。为什么不使用argparse而不是手动处理sys.argv?例如: import argparse as ap def argParse(): parser=ap.ArgumentParse

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

我通过键入从命令行运行程序

python ./client.py http://127.0.0.1 7000 HelloWorld.html

有人能告诉我我的代码有什么问题吗?提前感谢。

为什么不使用
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()
然后在主函数调用中:

args=argParse()
然后,您可以在代码中使用
args.host
args.port
args.filename
,argparse将处理缺少的参数及其类型等。您可以通过在
add_argument()
调用中的定义前面添加
-
来使用可选参数

您使用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

我看不出这有什么问题。试着像这样执行:./client.py 127.0.0.1 7000 HelloWorld.htmly你可以调试你的代码,不是吗?只需打印出
sys.argv
,看看是什么happening@haifzhan我想这就是脚本的名称。你能用行号打印出准确的错误吗?infoI复制了前5行代码,但我无法复制。
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