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)
该程序使用的是'sArgumentParser
类,因此不能像现在这样忽略它们。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服务器。