2016-04-19 11 views
0

Ich schreibe einen Python HTTP-Client. Wenn ich den Code unten habe, bekomme ich eine Fehlermeldung vom Terminal "Listenindex außerhalb des Bereichs".sys.argv [1] IndexError: Listenindex außerhalb des Bereichs

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 

Ich betreibe das Programm von der Kommandozeile von

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

eingeben jemand mir zeigen konnte, was mit meinem Code falsch? Danke im Voraus.

+0

ich damit nichts sehen sofort falsch nicht. Versuchen Sie es wie folgt auszuführen: ./client.py 127.0.0.1 7000 HelloWorld.html – MikeTGW

+0

es beginnt mit argv [0] – haifzhan

+1

Sie können Ihren Code debuggen, nein? Einfach sys.argv ausdrucken und sehen, was passiert –

Antwort

1

Warum nicht argparse verwenden, anstatt sys.argv manuell zu verarbeiten? Zum Beispiel:

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

Dann in der Hauptfunktionsaufruf:

args=argParse() 

Dann können Sie verwenden args.host, args.port und args.filename in Ihrem Code und argparse werden behandeln Argumente fehlen und sie Typen usw. Sie können mit optionale Argumente durch Hinzufügen -- vor ihren Definitionen in der add_argument() Aufruf.

Ihr Code mit 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