我正在制作一个 irc 机器人https://github.com/mouuff/MouBot
我希望机器人eval()
在消息以 !math 开头时回复它,但如果用户输入类似 !math exit() 之类的东西,它会创建失败那
5 回答
不。
看起来您正在尝试创建一个数学解析器。然后使用数学解析器,而不是成熟的 I-will-run-any-code-parser。如果你使用 *nix,你可以使用一个程序bc
来做你想做的事。
使用语言服务将其编译成 AST,遍历 AST 确保它仅包含列入白名单的节点集,然后执行它。
问题eval()
在于,当它执行时,它是有效的python代码,并且exit()
是python代码的有效部分,通常退出程序(尽管这个特定的功能应该在IDLE中使用,并且sys.exit()
在非空闲使用时优先使用)。
出于这个原因,eval()
应该只与受信任的输入一起使用,或者您应该为传递给eval()
函数的命令实现解析器,以消除不需要的输入(如果您希望实现自己的功能,可以查看shlex
模块的功能,split()
我已经将它用于许多解析器)。
如果你想要简单的数学评估,为什么你想把 Python 的全部力量放在后面,这可能而且将会被滥用。
使用PyParsing 之类的东西来编写一个简单的计算器,例如参见SimpleCalc.py或fournfn.py,我认为这些足以让您入门。你也可以试试SimpleParse
如果您确实想提供类似 eval 的强大且可滥用的功能,您应该启动一个 VM,其中启动将回复 eval 查询的服务器进程,并使用cgroups限制每个进程,当 VM 关闭时启动另一个进程或保留一个VM 和评估进程池。
我不确定它可以帮助你,但看看这个 - > http://doc.pypy.org/en/latest/sandbox.html
或者这个-> Python 沙盒是否有替代 rexec 的方法?