CodeGo.net> IronPython.Runtime.UnboundNameException:名称“ STR”未定义
作者:互联网
我试图在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添加到builtins中而不是替换它?
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版本中它仍然保持“稳定”,并且它可能不像官方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
现在让我们更加务实:没有人会在不久的将来修复该错误.
因此,您可以尝试通过以下方式“恢复” 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异常是显式的,可以通过很好的回溯来捕获.
标签:ironpython,python,c 来源: https://codeday.me/bug/20191108/2006928.html