2015-11-20 57 views
1

我一直想這個代碼,並從控制檯得到這個消息:Argparse錯誤試圖做簡單的UDP服務器客戶端

usage: Experimental.py [-h] [-p PORT] {client,server} 
Experimental.py: error: the following arguments are required: role 

我不能決定什麼是錯的,這是代碼:

import argparse, socket 
    from datetime import datetime 
    MAX_BYTES = 65535 
    def server(port): 
     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     sock.bind(('127.0.0.1', port)) 
     print('Listening at {}'.format(sock.getsockname())) 
     while True: 
      data, address = sock.recvfrom(MAX_BYTES) 
      text = data.decode('ascii') 
      print('The client at {} says {!r}'.format(address, text)) 
      text = 'Your data was {} bytes long'.format(len(data)) 
      data = text.encode('ascii') 
      sock.sendto(data, address) 
    def client(port): 
     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     text = 'The time is {}'.format(datetime.now()) 
     data = text.encode('ascii') 
     sock.sendto(data, ('127.0.0.1', port)) 
     print('The OS assigned me the address{}'.format(sock.getsockname())) 
     data, address = sock.recvfrom(MAX_BYTES) # Danger! 
     text = data.decode('ascii') 
     print('The server {} replied {!r}'.format(address, text)) 


if __name__ == '__main__': 
    choices = {'client': client, 'server': server} 
    parser = argparse.ArgumentParser(description='Send and receive UDP locally') 
    parser.add_argument('role', choices=choices, help='which role to play') 
    parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='UDP port (default 1060)') 
    args = parser.parse_args() 
    function = choices[args.role] 
    function(args.p) 
+1

這個網站是關於編程的問題,而不是關於如何運行別人寫的程序。 – user2357112

+0

錯誤消息類告訴你什麼是錯誤的:一個叫做'role'的參數是必需的,但是當你從命令行運行程序時你沒有指定它。在這種情況下,您必須指定'client'或'server'。像'> python Experimental.py server'。 – jme

回答

1

該程序使用argparse moduleArgumentParser類,其中assumes by default that positional arguments are required,所以你不能像你一樣忽略它們。該argparse教程提供a good definition of a positional argument

[位置參數]命名,是因爲該方案應該知道做什麼用的價值做,完全基於它出現在命令行上。這個概念與像cp這樣的命令更爲相關,cp最基本的用法是cp SRC DEST。第一個位置是您想要複製的位置,第二個位置是您希望複製到的位置。

在這種情況下,調用Experimental.py時,你忽略了一個名爲role位置的說法,這是近程序的最後定義:

parser.add_argument('role', choices=choices, help='which role to play') 

(因爲第一個參數('role')不與-(如-p)開始,add_argument registers it as a positional argument

The choices keyword argument to add_argument requires an iterable containing the possible values to supply,所以程序的作者經過choices,字典d定義爲:

choices = {'client': client, 'server': server} 

這其實很聰明;迭代字典會生成密鑰,所以argparse允許clientserver作爲role的值。因此,要解決此錯誤,您應該將clientserver作爲參數傳遞給程序,從而爲role提供值。更好的是,你可以看看argparse tutorial。 (我討厭告訴人們閱讀手冊,但我認爲這可能是有益的)

TL;博士:中代替:

$ python3 Experimental.py 

你應該嘗試下列之一:

$ python3 Experimental.py server 
$ python3 Experimental.py client