Python Argparse尝试执行简单UDP服务器客户端时出错

Python Argparse尝试执行简单UDP服务器客户端时出错,python,network-programming,Python,Network Programming,我一直在尝试此代码,并从控制台收到以下消息: 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

我一直在尝试此代码,并从控制台收到以下消息:

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)
该程序使用的是's
ArgumentParser
类,因此不能像现在这样忽略它们。argparse教程提供:

[positional argument]之所以这样命名,是因为程序应该知道如何处理该值,完全基于它在命令行上的显示位置。这个概念与cp这样的命令更相关,它的最基本用法是cp SRC DEST。第一个位置是要复制的位置,第二个位置是要复制到的位置

在本例中,在调用
Experimental.py
时,忽略了名为
role
的位置参数,该参数在程序末尾附近定义:

parser.add_argument('role', choices=choices, help='which role to play')
(因为第一个参数(
'role'
)不是以
-
开头的(比如
-p
),)

,因此程序的作者将传递
选项
,这是一个定义为:

choices = {'client': client, 'server': server}
这其实很聪明,;在字典上迭代生成键,因此argparse允许
客户机
服务器
作为
角色
的值。因此,要修复此错误,您应该将
客户端
服务器
作为参数传递给程序,从而为
角色
提供一个值。更妙的是,你可以查看一下。(我讨厌告诉人们阅读手册,但我认为这可能会有帮助)

tl;dr:而不是:

$ python3 Experimental.py
您应该尝试以下操作之一:

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

本网站是关于编程的问题,而不是关于如何运行其他人编写的程序。错误消息会告诉您出了什么问题:需要一个名为
role
的参数,但您在从命令行运行程序时没有指定它。在这种情况下,必须指定
客户端
服务器
。类似于python.py服务器。