【发布时间】:2019-06-13 17:46:37
【问题描述】:
我正在尝试在 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 函数未定义,这没有任何意义!
在此脚本运行之前还包含其他脚本;如果你愿意,我可以找到这些并将它们粘贴在这里以防万一……
编辑:这是我正在运行的完整脚本:
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
【问题讨论】:
-
如果它只是偶尔发生:是否有可能在代码的其他地方调用了变量
str? -
我在任何地方都没有看到我定义了一个名为
str...的变量... -
我可以在 CPython 3 中以
NameError: name 'str' is not defined重现您的消息的唯一方法是尝试del(str),但该消息失败。但是 IronPython 不是 CPython,所以这可能意义不大。很明显,__builtins__的模组中发生了一些奇怪的事情,但这并没有告诉你任何你没有怀疑过的事情。 -
是的,如果我删除前四行并没有真正做任何事情,那么脚本就可以工作。但是,如果我有实际的代码要导入到内置函数中,那将不起作用......
-
嗯,如果我执行以下步骤仍然会损坏:1. 开始一个新的单人游戏,2. 处理一个回合,3. 打开星球报告 - 如果我加载游戏时没有正在转弯!
标签: c# python ironpython