Управление файлом Python из C # - PullRequest
5 голосов
/ 28 октября 2011

Я работаю над некоторыми инструментами для игры, которую делаю.Инструменты служат интерфейсом для облегчения редактирования файлов игры.Некоторые из этих файлов являются файлами сценариев Python.Например, у меня есть файл Items.py, который содержит следующее (например, минимизировано)

from ItemModule import *

import copy

class ScriptedItem(Item):
    def __init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower):
        Item.__init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower, Item.GetNextItemID())
    def Clone(self):
        return copy.deepcopy(self)

ItemLibrary.AddItem(ScriptedItem("Abounding Crystal", "A colourful crystal composed of many smaller crystals. It gives off a warm glow.", ItemType.SynthesisMaterial, ItemType.SynthesisMaterial, 0, ItemUsage.Unusable, 0, 50))

Как я уже упоминал, я хочу предоставить интерфейс для редактирования этого файла без необходимости редактора, чтобы знать Python/ редактировать файл напрямую.Мой редактор должен уметь:

  1. Находить и перечислять все типы классов (в этом примере это будет только Scripted Item)
  2. Находить и перечислять все созданные элементы (в этом случае будет только один, Abounding Crystal).Мне нужно найти тип (в данном случае ScriptedItem) и все значения параметров
  3. Разрешить редактирование параметров и создание / удаление элементов.

Для этого яначал писать свой собственный анализатор, искал ключевое слово класса и когда эти записанные классы используются для конструирования объектов.Это работало для простых данных, но когда я начал использовать классы со сложными конструкторами (списки, карты и т. Д.), Стало все труднее правильно анализировать.

После поиска я обнаружил, что IronPython облегчает синтаксический анализ pythonфайлы, так вот что я делал.Создав абстрактное синтаксическое дерево, я использовал PythonWalkers, чтобы идентифицировать и найти всю необходимую мне информацию.Это прекрасно работает для чтения данных, но я не вижу простого способа вставить обновленные данные в файл Python.Насколько я могу судить, невозможно изменить значения в AST и тем более преобразовать AST обратно в файл сценария.Если я ошибаюсь, я бы хотел, чтобы кто-нибудь рассказал мне, как я могу это сделать.Теперь мне нужно поискать в файле, пока я не найду правильную строку, а затем попытаться вставить данные в конструктор, обеспечив правильное упорядочение.

Есть ли какое-то очевидное решение, которого я не вижу?Должен ли я просто продолжать работать со своим парсером и заставить его поддерживать более сложные типы данных?Я действительно думал, что у меня это было с парсером IronPython, но я не думал о том, насколько сложно было бы перенести измененные данные обратно в файл.

Буду признателен за любые предложения

Ответы [ 4 ]

1 голос
/ 28 октября 2011

Требуется инструмент преобразования программы источник-источник .

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

Такой инструмент преобразования программ должен анализировать текст в AST и «анти-синтаксический анализ»(называется "Prettyprint") AST к тексту.Если у IronPython есть симпатичный принтер, это то, что вам нужно.Если этого не произойдет, вы можете создать его с некоторыми (может быть, много) усилий;как вы заметили, это не так просто, как можно подумать.См. Мой ответ Компиляция AST обратно к исходному коду

Если это не сработает, наш инструментарий реинжиниринга программного обеспечения DMS с интерфейсом Python может сделать свое дело.Обладает всеми вышеперечисленными свойствами.

0 голосов
/ 24 мая 2012

Для меня это больше похоже на то, что вы находитесь в точке, где вы помещаете все это в базу данных sqlite и начинаете редактировать ее таким образом.Подключение некоторых форм для редактирования таблиц проще для пользовательского интерфейса.В этот момент вы генерируете новые файлы Python, выгружая свои таблицы с некоторым форматированием для предоставления окружающих скриптов Python.

SVN / Git / что угодно может объединить обновленные изменения через файлы Python.Это то, что я сделал для своего проекта в любом случае.Я начал использовать python для подключения различных элементов, используя их вычисленные ключи, а затем просто добавил некоторые формы интерфейса, чтобы избежать ошибок редактирования в файлах python.

0 голосов
/ 28 октября 2011

Вы можете использовать модуль python inspect, чтобы напечатать источник объекта.В вашем случае: распечатать исходный код вашего модуля - файл, который вы только что проанализировали с помощью IronPython.Однако я еще не проверял, работает ли inspect с IronPython.

Что касается добавления материала, ну, это модуль, верно?Вы можете просто добавить материал в модуль ... Я бы загрузил модуль, а затем изменил его, использовал inspect, чтобы просмотреть распечатать его и сохранить на диск.

Из вашего поста он выглядит как вы 'Я уже глубоко в окопах и получаю удовольствие, так что я был бы очень рад увидеть здесь пост о том, как вы решили эту проблему!

0 голосов
/ 28 октября 2011

При условии, что вы можете найти полный и современный контекстно-свободный файл грамматики для Python, вы можете использовать генератор парсеров CoCo / R для генерации парсера Python в C #.

Вы можете добавить производственный код в сам файл грамматики, чтобы заполнить структуру данных в вашем приложении C #. Указанная структура данных может содержать всю необходимую информацию (методы и их аргументы, свойства, конструкторы, деструкторы и т. Д.). Если у вас есть эта структура данных, это просто задача разработки внешнего интерфейса для пользователя и представления этой структуры данных таким образом, чтобы сделать ее редактируемой для них (это скорее задача проектирования, чем сложная задача программирования).

Наконец, проведите итерацию по структуре данных и запишите файл .py.

...