在我正在编写的程序(基于文本的rpg)中,我将包括“脚本”,即为游戏添加交互功能的小代码片段(例如,当你进入房间时,NPC会向你打招呼)。编写我自己的脚本语言/解析器似乎是一项相当大的任务,所以我想我应该使用Python代码本身。它可以做我需要的所有脚本之外的事情,所以我开始不断地修改。对于像打印语句或数学这样的简单事情,exec()可以很好地工作。当我遇到一个块的时候,麻烦就出现了。这就是它的实际作用:
第一个工作代码(来自交互式shell):
>>> x = ''
>>> y = []
>>> while x != '@':
        y.append(x)
        x = raw_input(compile('''''', '<string>', 'exec'))
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>name = 'Drew'
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>print 'Hello, %s' % name
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>@
>>> del x[0] # removes the empty field created by the first y.append(x)
>>> for line in y:
        exec line
>>> Hello, Drew现在对于错误(同样来自交互式提示符):
>>> x = ''
>>> y = []
>>> while x != '@':
        y.append(x)
        x = raw_input(compile('''''', '<string>', 'exec'))
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>name = 'Drew'
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>if name == 'Drew':
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>print 'Hi, %s!' % name
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>else:
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>print 'Greetings, stranger.'
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>@
>>> del y[0]
>>> for line in y:
        exec line
Traceback (most recent call last):
  File "<pyshell#308>", line 2, in <module>
    exec line
  File "<string>", line 1
    if name == 'Drew':
                     ^
SyntaxError: unexpected EOF while parsing如您所见,:字符(这是选择块所必需的)导致exec出错。我能做些什么来解决这个问题吗?我已经试着绕过这个问题好几个小时了,但我似乎还是想不通。这是不可能的吗?
非常感谢你阅读这篇文章,我感谢所有给予我的帮助。
发布于 2011-04-25 02:44:04
当从空闲的编辑窗口运行时,以下代码在2.7中可用:
line=''
lines = []
print "Enter Python lines (@ to quit):"
while line != '@':
    line=raw_input()
    lines.append(line)
lines.pop() # delete '@' line
lines = '\n'.join(lines)
exec linesShell窗口中的结果:
>>> 
Enter Python lines (@ to quit):
name = 'Terry'
if name == 'Drew':
  print 'Hi Drew'
else:
  print 'Hi stranger'
@
Hi stranger请注意,行需要使用'\n‘连接,而不是'’。此外,加入后,代码段不会以'\n‘结尾。我认为这可能是早期版本的Python的问题,在早期版本的Python中,exec可能需要一个终端'\n‘来处理多行块。
也就是说,这是一种糟糕的代码输入方式。我花了三次尝试才没有错误地输入上面的内容!例如,对于初始输入和编辑来说,tkinter文本框小部件要好得多。
发布于 2011-04-24 23:32:04
您可以使用exec来计算单行。在此代码中:
if a == b:
  do_c()第一行由其自身计算,是a语法错误。也可以将上面的代码合并为一行:
if a == b: do_c()在更一般的情况下,允许多行,您可以做的是将整个输入收集到一个字符串中(使用正确的空格),然后对其调用exec:
source = '''
name = "joe"
if name == "joe":
    print "hi joe"
else:
    print "hi stranger"
'''
exec source您已经知道应该以特殊的字符(@)结束输入,但是如果用户需要编写多行语句,您还应该期望用户为Python提供正确的空格。
https://stackoverflow.com/questions/5771392
复制相似问题