如何在 Python 2.7 中评估 BASH-Like 命令 (if/elif/else) 语句

Posted

技术标签:

【中文标题】如何在 Python 2.7 中评估 BASH-Like 命令 (if/elif/else) 语句【英文标题】:How to evaluate BASH-Like commands (if/elif/else) statements within Python 2.7 【发布时间】:2017-08-27 13:05:14 【问题描述】:

我正在创建一个 Hacking Sim 游戏。

在我的游戏中,我正在尝试实现 BASH 脚本供玩家使用。

请注意:

玩家可以与其他玩家共享脚本 所有“BASH”命令都是自定义的,由我的游戏处理 命令当前由 argparse 处理 此游戏适用于 Windows,使用 Python2.7 编写

这是我如何处理命令的示例:

class Console():
    def do_echo(self, args):
        cmd_echo = argparse.ArgumentParser(description="Prints out whatever you pass it", prog='echo')
        cmd_echo.add_argument("text",  metavar=("<text>"), help="The text to echo (\"in quotes\")", default=None)

        # Processes the command - Capture '--help' or argument errors (e.g: Typos)
        try: arg = cmd_echo.parse_args(args)
        except SystemExit: return # Voids the SystemExit that argparse calls, while allowing other errors

        print arg.text

def run(command)
    sys_args = shlex.split(command)
    if 'do_'+sys_args[0].lower() in dir(Console):
        function = sys_args[0] ; sys_args.pop(0)
        fn = 'Console().do_%s(%s)' % (function,sys_args)
        eval(fn)

在处理脚本(.sh)时,我只使用for line in f.readlines(): run(line)。 (是的,我知道“eval is badddd”,但实际上我试图利用该过程并没有想出任何结果。)从游戏内终端发送的命令以相同的方式解析。

但是,我需要知道如何处理if/else/for/etc..

如何在我当前的代码中实现这一点?

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 @Bhargav 一些 cmets(特别是最后几个)与帖子相关。 是的,他们都在这里存档chat.***.com/transcript/139708 【参考方案1】:

最终,如果您想要用户可编程的脚本,您将需要进行某种解释和执行。此外,根据安全性对您的重要性,您必须考虑执行这些脚本的上下文以及它们可以做什么。

我强烈建议您从以下内容开始:http://norvig.com/lispy.html。这是在 python 之上实现解释语言的一个非常简单的示例。祝你好运!

【讨论】:

所有现有命令都是我在我的游戏中特别创建的。我只想知道如何特别执行 if 和 for 命令。 我明白,这正是您需要编写解释器的原因。如果您仔细阅读该链接,我相信您会发现它非常有用。 今天早上我已经略读过了。我已经有了 90% 的代码,我只需要知道如何解析多行命令。特别是if [$var1 == $var2] then &lt;run code&gt; fi

以上是关于如何在 Python 2.7 中评估 BASH-Like 命令 (if/elif/else) 语句的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 2.7 中获取代码块的执行时间

信管2.7项目可研项目论证与评估

如何在python 2.7中使用“e”(欧拉数)和幂运算

如何在 MacOS 上明确卸载 python 2.7 [重复]

如何在python 2.7中获取随机整数[重复]

如何在 python 2.7 中使用 ssl