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