2016-04-19 4 views
0

Я пишу HTTP-клиент Python. Когда у меня есть код ниже, я получаю сообщение об ошибке из терминала «index index out the range».sys.argv [1] IndexError: индекс индекса за пределами допустимого диапазона

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 

Может кто-нибудь показать мне, что случилось с моим кодом? Заранее спасибо.

+0

Я не вижу ничего плохого тут с этим. Попробуйте выполнить его так: ./client.py 127.0.0.1 7000 HelloWorld.html – MikeTGW

+0

начинается с argv [0] – haifzhan

+1

Вы можете отлаживать свой код, нет? Просто распечатайте 'sys.argv' и посмотрите, что происходит –

ответ

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() 

Затем в главном вызове функции:

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 
Смежные вопросы