如何创建一个接受命令并打印“$”提示的shell程序,以指示用户可以使用while循环输入命令?

2024-04-25 20:57:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个初级的Python程序员,对于如何创建一个简单的shell程序来接受命令(例如printprecipes、printinventory、load等)我很不确定

输入应如下所示:

$loadrecipes个

$printmoney()

20个

对于这个shell,我尝试使用while循环,这样即使他们输入了一个可以接受的命令,程序也不会崩溃。你知道吗

def handle_commands():
    keep_going=True
    command=input("$" + " ")
    while keep_going:
        if command == '$ quit':
            keep_going = False
            break
        elif command == "$ loadrecipefile(recipe_file)"
            j
        elif command == "$ printrecipes":
            printrecipes()
        elif command == "$ printiinventory":
            printiinventory()
        elif command == "$ printmoney":
            printmoney()
        elif command == "$ buyingredient":

我不知道接下来该怎么办。 命令是loadrecipes(recipe\u file)接受一个参数,所有print命令不接受一个参数,buyIncomponent(component\u name,编号:int)接受2个参数(成分名称和这些成分的数量)。你知道吗

因此,对于每个命令,我都创建了一个对应的函数。例如对于printiinventory(),我有:

def printiinventory():
  print(iinventory['apple'],iinventory['beets'],iinventory['carrots'])

如果命令是:

$printiinventory公司

0 4 3个

结果应该是这样


Tags: 命令程序参数defrecipeshellcommandkeep
1条回答
网友
1楼 · 发布于 2024-04-25 20:57:29

所以你的流程应该是这样的:

while True:
    command = input("$ ")
    if command is ...
    elif ...:

与您所拥有的非常相似,不同的是您不需要期望$进入用户的输入。Input函数打印传递的参数并仅返回用户的输入,而不是同一行中的其余内容。因此,您应该检查command == "printrecipes"等命令

说明:

这段代码:

x = input(str)

相当于:

print(str); x = input(str)

唯一的区别是print()创建了一个新行,因此输入将取自打印内容下方的行。你知道吗

您可以用IO低级Python模块来模拟这种行为(即在同一行中打印),但是您不需要这样做。你知道吗

编辑

为了解析命令,您可以选择经典的命令行接口语法,用空格分隔命令名和参数,或者您也可以创建自己的解析器。在第一种情况下,可以使用Python的内置argparse模块。如果您更愿意使用第二个解析器(这更令人头痛,尤其是如果您是初学者的话),您必须从头开始编写自己的解析器。如果你知道regex,这没什么大不了的,但恐怕你应该在网站上问另一个问题。我建议你看一些教程。只需在google上搜索一下:“makemyownecommandparserpython”就可以得到成千上万的结果,尽管其中大多数结果都是经典的命令行解析语法。你知道吗

编辑2

我注意到你使用了某种标志来检查你是否需要继续进入循环。这在您使用的代码中是没有用的;只需使用break命令就可以了。你知道吗

编辑3

仔细看看OP的注释,我发现您正在尝试编写由Python脚本执行的Python代码。您当然可以这样做;您已经有了evalexec模块,但是请注意,这是一种非常危险的做法,代码很容易被注入到您的程序中,造成巨大的安全漏洞。这样做是非常不鼓励的。必须将命令解析和任务执行分开。用户不能直接访问程序的控制流。你知道吗

相关问题 更多 >