为 python 服务器创建一种命令行
Create a sort of command line for a python server
我一直在试验 Python 套接字服务器等。我遇到了一个想法,但我很难实施它。我希望服务器端能够输入不同的命令,用于启动和停止服务器,以及执行各种其他任务。我的问题是,当我开始有很多命令时,我的程序最终看起来像意大利面条:
if command == "start":
print("Starting server")
time.sleep(1)
listener_thread.start()
elif command == "stop":
print("Stopping server...")
time.sleep(1)
listener_thread.stop()
elif command in ["q", "quit"]:
print("Quitting server...")
time.sleep(1)
for t in connections:
t.stop()
listener_thread.stop()
exit()
else:
print("Invalid command")
我的一位编程了一段时间的朋友说我应该尝试使用字典来存储每个命令的函数引用。我创建了一个这样的字典:
commands = {
"start": cmd_start, # This would be a reference to cmd_start()
"stop": cmd_stop, # Same here and so forth
"quit": cmd_quit
}
我会这样调用这些命令:
while True:
command = input("enter a command: ")
if command in commands:
commands[command]()
这个方法的问题是有时我想要一个有多个参数的命令,有时我不需要。我希望能够使用具有不同参数的不同命令,指定它们所需的参数,并检查以确保该命令是具有所有必需参数的有效命令。我是编程新手,我曾尝试想出一种干净的方法来实现它。我在 google 上找不到任何有用的信息,所以希望有人能帮助我。谢谢
如果您知道命令的结构,这是一项解析任务,并且取决于格式。除此之外,您可以发送可变长度参数 using the star operator *
(您也可以使用 **
发送关键字参数,但我会从这个开始)。
这是一个简单的例子:
command = input("enter a command: ")
arguments = input("enter arguments separated by a single space: ").split()
if command in commands:
commands[command](*arguments)
请注意,这会将所有参数作为字符串发送。这是一个基本的演示:
>>> def func_with_three_params(a, b, c):
... print a, b, c
...
>>> three_args = "1 2 3".split()
>>> func_with_three_params(*three_args)
1 2 3
如您问题的评论中所述,这是一项非常常见的任务,并且确实存在用于解析各种常见格式的库。一个经常使用的(我也用它)是 argparse
.
一个接近发帖者原始源代码的简单工作示例:
tokens = input("$ ").split()
command, arguments = tokens[0], tokens[1:]
def start_handler(start_line, end_line):
print("Starting from {} to {}".format(start_line, end_line))
commands = {
"start": start_handler
}
commands[command](*arguments)
您可以输入如下命令:start 1 20
,它会将 1 和 20 传递给启动处理程序。示例输出:
$ start 1 20
Starting from 1 to 20
我一直在试验 Python 套接字服务器等。我遇到了一个想法,但我很难实施它。我希望服务器端能够输入不同的命令,用于启动和停止服务器,以及执行各种其他任务。我的问题是,当我开始有很多命令时,我的程序最终看起来像意大利面条:
if command == "start":
print("Starting server")
time.sleep(1)
listener_thread.start()
elif command == "stop":
print("Stopping server...")
time.sleep(1)
listener_thread.stop()
elif command in ["q", "quit"]:
print("Quitting server...")
time.sleep(1)
for t in connections:
t.stop()
listener_thread.stop()
exit()
else:
print("Invalid command")
我的一位编程了一段时间的朋友说我应该尝试使用字典来存储每个命令的函数引用。我创建了一个这样的字典:
commands = {
"start": cmd_start, # This would be a reference to cmd_start()
"stop": cmd_stop, # Same here and so forth
"quit": cmd_quit
}
我会这样调用这些命令:
while True:
command = input("enter a command: ")
if command in commands:
commands[command]()
这个方法的问题是有时我想要一个有多个参数的命令,有时我不需要。我希望能够使用具有不同参数的不同命令,指定它们所需的参数,并检查以确保该命令是具有所有必需参数的有效命令。我是编程新手,我曾尝试想出一种干净的方法来实现它。我在 google 上找不到任何有用的信息,所以希望有人能帮助我。谢谢
如果您知道命令的结构,这是一项解析任务,并且取决于格式。除此之外,您可以发送可变长度参数 using the star operator *
(您也可以使用 **
发送关键字参数,但我会从这个开始)。
这是一个简单的例子:
command = input("enter a command: ")
arguments = input("enter arguments separated by a single space: ").split()
if command in commands:
commands[command](*arguments)
请注意,这会将所有参数作为字符串发送。这是一个基本的演示:
>>> def func_with_three_params(a, b, c):
... print a, b, c
...
>>> three_args = "1 2 3".split()
>>> func_with_three_params(*three_args)
1 2 3
如您问题的评论中所述,这是一项非常常见的任务,并且确实存在用于解析各种常见格式的库。一个经常使用的(我也用它)是 argparse
.
一个接近发帖者原始源代码的简单工作示例:
tokens = input("$ ").split()
command, arguments = tokens[0], tokens[1:]
def start_handler(start_line, end_line):
print("Starting from {} to {}".format(start_line, end_line))
commands = {
"start": start_handler
}
commands[command](*arguments)
您可以输入如下命令:start 1 20
,它会将 1 和 20 传递给启动处理程序。示例输出:
$ start 1 20
Starting from 1 to 20