IronPython.Runtime.UnboundNameException: имя 'str' не определено - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь запустить скрипт IronPython в C #, но иногда, когда я запускаю его, я получаю эту ошибку:

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

Я не могу понять, почему это происходит;это случается только иногда;прямо сейчас это происходит, когда я щелкаю планету в своей игре, чтобы просмотреть отчет о ее возможностях.

Вот сценарий, который я пытаюсь запустить:

'Mines ' + str(Amount1) + ' minerals each turn (modified by planet value).'

Как видите, яя пытаюсь объединить некоторые строки, одна из которых является строковой переменной Amount1 (Amount1, я думаю, это число 800, но это может быть более сложное выражение, равное 800, я должен проверить это), но по какой-то причинеЯ получаю сообщение о том, что функция str не определена, что не имеет смысла!

Перед запуском этого сценария включены другие сценарии;если хотите, я могу найти их и вставить сюда, если это может помочь ...

edit: вот полный скрипт, который я запускаю:

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).'

Could the exec builtins_code строка удаляет функцию str?Если да, то как я могу убедиться, что builtins_code добавляется во встроенные функции, а не заменяет его?

edit2: нет, даже если я удаляю первые четыре строки, происходит сбой при обработке поворота за один разИгрок, а затем щелкните мой родной мир!

edit3: если я помещаю скрипт в текстовый файл и запускаю его как часы (см. ниже), он работает очень хорошо, даже в точке останова, где он падает:

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

1 Ответ

0 голосов
/ 29 января 2019

Строка:

exec builtins_code in builtins.__dict__

просто добавляет _ в интерактивную среду, чтобы она повторяла последнюю оцененную переменную.Без этой строки _ не определено.Обратите внимание, что эта функция не очень полезна в сценарии и может быть удалена.Похоже, это не связано с вашей проблемой.

Похоже, единственный интерес IronPython - возможность легко взаимодействовать с Microsoft / C #, но он остается "стабильным" в версии 2.7 и, вероятно, не такбесплатные как официальные версии python (похожая ошибка встречалась и не была решена на reddit , не то чтобы это помогло, но вы знаете, что вы не единственный ...).

It имеет , чтобы быть ошибкой, потому что вы не можете удалить встроенное, когда оно не переопределено:

>>> 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 являются явными и могут быть перехвачены с хорошим отслеживанием.

...