IronPython.Runtime.UnboundNameException异常:未定义名称“str”

2024-10-03 17:17:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用C语言运行一个IronPython脚本,但有时运行时会出现以下错误:

IronPython.Runtime.UnboundNameException: name 'str' is not defined

我不明白为什么会发生这样的事情;这只是偶尔发生的;现在,当我在游戏中点击一颗行星来查看关于它能力的报告时,就会发生这种情况。在

下面是我要运行的脚本:

^{pr2}$

如您所见,我正在尝试连接一些字符串,其中一个字符串化的Amount1变量(Amount1我认为是数字800,但它可能是一个更复杂的表达式等于800,我必须检查它),但由于某些原因,我得到一个错误,说str函数未定义,这没有意义!在

在这个脚本运行之前还包括其他脚本;如果你愿意,我可以找到这些脚本并粘贴到这里,以防可能有帮助。。。在

编辑:以下是我正在运行的完整脚本:

import sys, imp;
import __builtin__ as builtins;
builtins_code = """""";
exec builtins_code in builtins.__dict__;
import clr
clr.AddReference('System.Core')
import System
clr.ImportExtensions(System.Linq)
clr.AddReference('FrEee.Core')
import FrEee
import FrEee.Utility
clr.ImportExtensions(FrEee.Utility.Extensions)
from FrEee.Modding import Mod
from FrEee.Game.Objects.Space import Galaxy
from FrEee.Game.Objects.Civilization import Empire
'Mines ' + str(Amount1) + ' minerals each turn (modified by planet value).'

exec builtins_code行可能正在删除str函数吗?如果是这样,我如何确保builtins_code被添加到内置而不是替换它?在

编辑2:不,即使我去掉前四行,当我在单人游戏中处理一个回合,然后点击我的家庭世界时,它会崩溃!在

edit3:如果我把脚本放在一个文本文件中并作为监视程序运行(见下文),它运行得很好,即使在它崩溃的断点上:

FrEee.Modding.ScriptEngine.EvaluateExpression<string>(System.IO.File.ReadAllText("c:/users/edkol/desktop/test.py")), ac


Tags: 函数字符串fromimport脚本编辑错误code
1条回答
网友
1楼 · 发布于 2024-10-03 17:17:20

行:

exec builtins_code in builtins.__dict__

只需将_添加到交互环境中,以便它重复上次计算的变量。没有那行,_就没有定义。请注意,此功能在脚本中不是很有用,可以删除。这似乎与你的问题无关。在

IronPython的唯一兴趣似乎是能够轻松地与Microsoft/C进行交互,但它在2.7版本中仍然“稳定”,而且可能没有正式的python版本那样没有bug(遇到过类似的bug,但没有解决{a1},这并没有帮助,但您知道您不是唯一的一个……)。在

它是一个bug,因为当一个内置项未被覆盖时,您无法将其删除:

^{pr2}$

现在让我们务实一点:在不远的将来,不可能有人会修复这个bug。在

因此,您可以尝试通过执行以下操作来“还原”str名称:

str = __builtins__.get('str')

我没有对此进行测试,也许一旦您处于这种奇怪的状态,它也不会起作用,但是还有其他方法可以使用实例和__class__属性来获取“丢失”类名:

>>> "".__class__(34)   # "".__class__ is str
'34'
>>> 0 .__class__(1.4)   # note the space to help the parser :)
1

唯一的问题是你的代码看起来会很奇怪。别忘了评论!在

无论如何,您不需要str为此,您可以通过在格式字符串(位置)上使用str.format来解决您的问题:

'Mines {} minerals each turn (modified by planet value).'.format(Amount1)

或按关键字:

'Mines {Amount1} minerals each turn (modified by planet value).'.format(Amount1=Amount1)

该方法不涉及str内置。并不是说您不会有其他问题,但是即使str可用,这也是格式化字符串的首选方法。在

通过避免这些错误来解决问题。幸运的是,python异常是显式的,可以通过良好的回溯来捕获。在

相关问题 更多 >