【问题标题】:How can I execute a command inputted by the user as a turtle command?如何将用户输入的命令作为海龟命令执行?
【发布时间】:2012-11-15 21:39:19
【问题描述】:

我需要能够向用户询问乌龟命令,例如 forward(90) 并将其作为乌龟命令执行,例如 turtle.forward(90) 并重复直到用户退出。 到目前为止我有:

def turtle_input(prompt):
"""Loop to ask for user input and execute as a turtle command"""
import turtle
while True:
    t = input('Enter a turtle command: ')
    if t in ['Quit' , 'quit', 'q', 'Q']:
        break
    turtle.(t)     
return prompt

【问题讨论】:

  • 除非您使用 python 3,否则您可能需要raw_input() 而不是input()

标签: python input command turtle-graphics


【解决方案1】:

执行任意代码通常不是一个好主意,因为它是一个巨大的安全漏洞,但这里有一种方法:

eval('turtle.{0}'.format(t))

这不是一个好主意,因为请考虑用户可以传入的以下字符串:

t = 'forward(90) or __import__("os").system("rm -rf ~")'

突然之间,您的主目录开始被删除——糟糕。


一个稍微不那么健壮但更安全的解决方案可能是使用ast.literal_eval 并自己解析字符串:

import ast

#...
funcname,args = t.split('(',1)
args = ast_literal_eval('('+args)
if hasattr(args,'__iter__'):
    getattr(turtle,funcname)(*args)
else:
    getattr(turtle,funcname)(args)

【讨论】:

  • 成功了,谢谢!它仅供私人使用,所以我不认为我会输入!只是出于好奇,什么是更安全的选择?
  • 您可以采取措施使eval 更加安全。 (检查字符串以确保其中没有__,限制eval 可以访问的命名空间等)。否则,您必须实际解析您的字符串。不过可能还不算太糟糕。我马上更新……
  • 另一方面,这个人可以输入'import os',然后输入'os.sytem('del C:')',它没有下划线,但仍然会杀死你的计算机。
  • @Kevin -- 这属于“限制命名空间”条款。请注意,'import os' 在裸 eval 中会失败,因为它不是表达式,而是语句
  • 哦,可能会造成很多破坏;如果他们已经导入了操作系统,那么 os.system('del C:') (我认为)会起作用,或者可以简单地输入会使程序崩溃的输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多