首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当遇到:字符时,exec()会引发“意外的EOF”错误

当遇到:字符时,exec()会引发“意外的EOF”错误
EN

Stack Overflow用户
提问于 2011-04-24 23:23:06
回答 2查看 1.9K关注 0票数 2

在我正在编写的程序(基于文本的rpg)中,我将包括“脚本”,即为游戏添加交互功能的小代码片段(例如,当你进入房间时,NPC会向你打招呼)。编写我自己的脚本语言/解析器似乎是一项相当大的任务,所以我想我应该使用Python代码本身。它可以做我需要的所有脚本之外的事情,所以我开始不断地修改。对于像打印语句或数学这样的简单事情,exec()可以很好地工作。当我遇到一个块的时候,麻烦就出现了。这就是它的实际作用:

第一个工作代码(来自交互式shell):

代码语言:javascript
运行
复制
>>> 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

现在对于错误(同样来自交互式提示符):

代码语言:javascript
运行
复制
>>> 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出错。我能做些什么来解决这个问题吗?我已经试着绕过这个问题好几个小时了,但我似乎还是想不通。这是不可能的吗?

非常感谢你阅读这篇文章,我感谢所有给予我的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-25 02:44:04

当从空闲的编辑窗口运行时,以下代码在2.7中可用:

代码语言:javascript
运行
复制
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 lines

Shell窗口中的结果:

代码语言:javascript
运行
复制
>>> 
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文本框小部件要好得多。

票数 2
EN

Stack Overflow用户

发布于 2011-04-24 23:32:04

您可以使用exec来计算单行。在此代码中:

代码语言:javascript
运行
复制
if a == b:
  do_c()

第一行由其自身计算,是a语法错误。也可以将上面的代码合并为一行:

代码语言:javascript
运行
复制
if a == b: do_c()

在更一般的情况下,允许多行,您可以做的是将整个输入收集到一个字符串中(使用正确的空格),然后对其调用exec

代码语言:javascript
运行
复制
source = '''
name = "joe"
if name == "joe":
    print "hi joe"
else:
    print "hi stranger"
'''
exec source

您已经知道应该以特殊的字符(@)结束输入,但是如果用户需要编写多行语句,您还应该期望用户为Python提供正确的空格。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5771392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档