2016-04-19 6 views
0

私はPython HTTPクライアントを作成しています。 以下のコードを入力すると、端末「リストのインデックスが範囲外です」からエラーメッセージが表示されます。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

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

次に、あなたのコードとargparseでargs.hostargs.portargs.filenameを使用することができますが不足している引数と彼らのタイプを処理するなどあなたが使用することができますオプションの引数には、コールの定義の前に--を追加します。 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