我正在尝试创建自定义命令行来控制机械臂。因此,我希望能够运行该程序并键入ServeMove(arg1,arg2),并将arg1和arg2转移到函数ServoMove中。我相信这就是您所说的命令行界面。
servoPos = [0,1,2,3,4]
def servoMove(servo,angle):
servoPos[servo] = angle
print(servoPos[servo])
def commands(cmd):
if cmd == 'servoMove('+arg1+','+arg2+')':
servoMove(arg1,arg2)
else:
print("[Error] - Unknown Command")
commands(input(""))
显然,下面的代码不适用于此。
if cmd == 'servoMove('+arg1+','+arg2+')':
servoMove(arg1,arg2)
有人知道我该怎么做吗?
您可以使用正则表达式来解析命令。
import re
def commands(cmd):
m = re.match(r'servoMove\((\d+),(\d+)\)', cmd)
if m:
servoMove(int(m.group(1)), int(m.group(2)))
return
# Put similar tests for other commands here
# ...
print("[Error] - Unknown Command")
这是一种非常粗糙的方法-如果用户未正确输入命令,它将抱怨该命令未知。如果您想要更强大的功能,则需要学习如何编写真实的解析器。或者使用更好的用户界面(例如Tkinter)来实现用户可以填写的表单。
仅查看结构,问题出在if语句中:arg1和arg2在该阶段未定义,因此您将得到False。对于初学者,您想用类似的东西代替它:
#Look at the nine first characters to see if they match your function
if cmd[:9] == 'servoMove':
[要提取您的参数,我将使用一些字符串操作,如here.中所示,我将输入切成薄片以将“(”和“,”之间的文本作为arg1,将“,”和“)”之间的文本作为arg2 。
arg1 = cmd[cmd.find("(")+1:cmd.find(",")]
arg2 = cmd[cmd.find(",")+1:cmd.find(")")]
放在一起:
def commands(cmd):
if cmd[:9] == 'servoMove':
arg1 = cmd[cmd.find("(")+1:cmd.find(",")]
arg2 = cmd[cmd.find(",")+1:cmd.find(")")]
servoMove(arg1, arg2)
else:
print("[Error] - Unknown Command")
您可以使用cmd module构建命令行界面。
这里是一个例子:
import cmd
servoPos = [0,1,2,3,4]
def servoMove(servo,angle):
servoPos[servo] = angle
print(servoPos[servo])
class ServoShell(cmd.Cmd):
prompt = '=> '
def do_servoMove(self, arg):
'Edit this to give a description to the function when typing ?'
servoMove(*parse(arg))
def parse(arg):
'Convert a comma separated string into a tuple'
return tuple(map(int, arg.strip('()').split(',')))
if __name__ == '__main__':
ServoShell().cmdloop()