IronPython.Runtime.UnboundNameException: 名称 'str' 未定义
IronPython.Runtime.UnboundNameException: name 'str' is not defined
我正在尝试 运行 C# 中的 IronPython 脚本,但有时当我 运行 它时,我会收到此错误:
IronPython.Runtime.UnboundNameException: name 'str' is not defined
我不明白为什么会这样;它只是有时发生;现在,当我在游戏中单击一个行星以查看其能力报告时,就会发生这种情况。
这是我正在尝试的脚本 运行:
'Mines ' + str(Amount1) + ' minerals each turn (modified by planet value).'
如您所见,我正在尝试连接一些字符串,其中一个是字符串化的 Amount1 变量(我认为 Amount1 是数字 800,但它可能是一个更复杂的表达式,等于 800,我会检查一下),但出于某种原因,我收到一条错误消息,提示 str
函数未定义,这毫无意义!
在此脚本 运行s 之前还包含其他脚本;如果您愿意,我可以找到这些并将它们粘贴到此处,以备不时之需...
编辑:这是我运行宁的完整脚本:
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
被添加到内置而不是替换它?
edit2: 不,即使我删除了前四行,当我在单人游戏中处理一个回合然后单击我的家园时它会崩溃!
edit3:如果我把脚本放在一个文本文件中 运行 它作为一个手表(见下文)它 运行 就很好,即使在它崩溃的断点上也是如此:
FrEee.Modding.ScriptEngine.EvaluateExpression<string>(System.IO.File.ReadAllText("c:/users/edkol/desktop/test.py")), ac
行:
exec builtins_code in builtins.__dict__
只是将 _
添加到交互环境中,因此它会重复上次评估的变量。如果没有该行,则 _
未定义。请注意,此功能在脚本中不是很有用,可以删除。这似乎与您的问题无关。
看起来 IronPython 的唯一兴趣是能够轻松地与 Microsoft/C# 东西交互,但它在 2.7 版本中仍然是 "stable",而且它可能不像官方 python 版本(遇到了类似的错误,但没有解决 on reddit,并不是说它有帮助,但你知道你不是唯一的...)。
它是一个错误,因为你不能删除未被覆盖的内置函数:
>>> str
<type 'str'>
>>> del str
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'str' is not defined
现在让我们务实一点:在不久的将来没有人会修复这个错误。
因此您可以通过以下方式尝试 "restore" str
名称:
str = __builtins__.get('str')
我没有对此进行测试,一旦您处于这种奇怪的状态,它可能也不会起作用,但是还有其他解决方法可以获取 "lost" class 名称,使用一个实例和 __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 异常是显式的,可以通过很好的回溯来捕获。
我正在尝试 运行 C# 中的 IronPython 脚本,但有时当我 运行 它时,我会收到此错误:
IronPython.Runtime.UnboundNameException: name 'str' is not defined
我不明白为什么会这样;它只是有时发生;现在,当我在游戏中单击一个行星以查看其能力报告时,就会发生这种情况。
这是我正在尝试的脚本 运行:
'Mines ' + str(Amount1) + ' minerals each turn (modified by planet value).'
如您所见,我正在尝试连接一些字符串,其中一个是字符串化的 Amount1 变量(我认为 Amount1 是数字 800,但它可能是一个更复杂的表达式,等于 800,我会检查一下),但出于某种原因,我收到一条错误消息,提示 str
函数未定义,这毫无意义!
在此脚本 运行s 之前还包含其他脚本;如果您愿意,我可以找到这些并将它们粘贴到此处,以备不时之需...
编辑:这是我运行宁的完整脚本:
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
被添加到内置而不是替换它?
edit2: 不,即使我删除了前四行,当我在单人游戏中处理一个回合然后单击我的家园时它会崩溃!
edit3:如果我把脚本放在一个文本文件中 运行 它作为一个手表(见下文)它 运行 就很好,即使在它崩溃的断点上也是如此:
FrEee.Modding.ScriptEngine.EvaluateExpression<string>(System.IO.File.ReadAllText("c:/users/edkol/desktop/test.py")), ac
行:
exec builtins_code in builtins.__dict__
只是将 _
添加到交互环境中,因此它会重复上次评估的变量。如果没有该行,则 _
未定义。请注意,此功能在脚本中不是很有用,可以删除。这似乎与您的问题无关。
看起来 IronPython 的唯一兴趣是能够轻松地与 Microsoft/C# 东西交互,但它在 2.7 版本中仍然是 "stable",而且它可能不像官方 python 版本(遇到了类似的错误,但没有解决 on reddit,并不是说它有帮助,但你知道你不是唯一的...)。
它是一个错误,因为你不能删除未被覆盖的内置函数:
>>> str
<type 'str'>
>>> del str
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'str' is not defined
现在让我们务实一点:在不久的将来没有人会修复这个错误。
因此您可以通过以下方式尝试 "restore" str
名称:
str = __builtins__.get('str')
我没有对此进行测试,一旦您处于这种奇怪的状态,它可能也不会起作用,但是还有其他解决方法可以获取 "lost" class 名称,使用一个实例和 __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 异常是显式的,可以通过很好的回溯来捕获。