1

我正在制作一个 irc 机器人https://github.com/mouuff/MouBot 我希望机器人eval()在消息以 !math 开头时回复它,但如果用户输入类似 !math exit() 之类的东西,它会创建失败那

4

5 回答 5

4

不。

看起来您正在尝试创建一个数学解析器。然后使用数学解析器,而不是成熟的 I-will-run-any-code-parser。如果你使用 *nix,你可以使用一个程序bc来做你想做的事。

于 2012-11-03T17:56:27.613 回答
1

使用语言服务将其编译成 AST,遍历 AST 确保它仅包含列入白名单的节点集,然后执行它。

示例实现由 unutbu 提供

于 2012-11-03T17:56:50.077 回答
0

问题eval()在于,当它执行时,它是有效的python代码,并且exit()是python代码的有效部分,通常退出程序(尽管这个特定的功能应该在IDLE中使用,并且sys.exit()在非空闲使用时优先使用)。

出于这个原因,eval()应该只与受信任的输入一起使用,或者您应该为传递给eval()函数的命令实现解析器,以消除不需要的输入(如果您希望实现自己的功能,可以查看shlex模块的功能,split()我已经将它用于许多解析器)。

于 2012-11-03T17:57:52.643 回答
0

如果你想要简单的数学评估,为什么你想把 Python 的全部力量放在后面,这可能而且将会被滥用。

使用PyParsing 之类的东西来编写一个简单的计算器,例如参见SimpleCalc.pyfournfn.py,我认为这些足以让您入门。你也可以试试SimpleParse

如果您确实想提供类似 eval 的强大且可滥用的功能,您应该启动一个 VM,其中启动将回复 eval 查询的服务器进程,并使用cgroups限制每个进程,当 VM 关闭时启动另一个进程或保留一个VM 和评估进程池。

于 2012-11-03T18:32:57.933 回答
0

我不确定它可以帮助你,但看看这个 - > http://doc.pypy.org/en/latest/sandbox.html

或者这个-> Python 沙盒是否有替代 rexec 的方法?

于 2012-11-03T19:03:01.087 回答