c# - 从 C# 操作 Python 文件

标签 c# python parsing ironpython

我正在为我正在制作的游戏开发一些工具。这些工具用作前端,使编辑游戏文件变得更加容易。其中有几个文件是 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. 查找并列出所有类类型(在此示例中,它只是 脚本项目)
  2. 查找并列出所有已创建的项目(在本例中只有一个, 丰富的 Crystal )。我需要找到类型(在这个 caseScriptedItem) 和所有参数值
  3. 允许编辑参数和创建/删除项目。

为此,我开始编写自己的解析器,寻找 class 关键字以及何时使用这些记录的类来构造对象。这适用于简单数据,但当我开始使用具有复杂构造函数(列表、映射等)的类时,正确解析变得越来越困难。

四处搜索后,我发现 IronPython 可以轻松解析 python 文件,所以这就是我着手做的事情。构建抽象语法树后,我使用 PythonWalkers 来识别和查找我需要的所有信息。这非常适合读取数据,但我没有看到将更新数据推送到 Python 文件的简单方法。据我所知,没有办法更改 AST 中的值,更不用说将 AST 转换回脚本文件了。如果我错了,我希望有人能告诉我如何做到这一点。我现在需要做的是搜索文件,直到找到正确的行,然后尝试将数据推送到构造函数中,确保顺序正确。

是否有一些我没有看到的明显解决方案?我是否应该继续研究我的解析器并使其支持更复杂的数据类型?我真的虽然我有它与 IronPython 解析器,但我没有想到将修改后的数据推回到文件中会有多棘手。

如有任何建议,我们将不胜感激

最佳答案

你想要源到源 program transformation tool .

这样的工具将语言解析为内部数据结构(通常是 AST),允许您修改 AST,然后可以从修改后的 AST 重新生成源文本,除了 AST 更改的地方外,基本上不会更改源的任何内容制作。

这样的程序转换工具必须将文本解析为 AST,并将“反解析”(称为“Prettyprint”)AST 解析为文本。如果 IronPython 有 pretty-print ,那就是您所需要的。 如果没有,您可以花费一些(也许很多)努力来构建一个;正如你所观察到的, 这并不像人们想象的那么容易。看我的回答 Compiling an AST back to source code

如果这不起作用,我们的 DMS Software Reengineering Toolkit与其 Python front end可能会成功。它具有上述所有特性。

关于c# - 从 C# 操作 Python 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7923810/

相关文章:

c# - 通过 WCF 服务从接口(interface)引用方法

c# - 在 WPF 中的远程桌面连接 (RDP) 后重新加载 View

python - 根据 header 身份验证 token 过滤 API 请求

iphone - 在 iPhone 上解析 HTML

json - 将 Excel 解析为 JSON

c# - ASP5/MVC6 中的 session 变量

c# - 如何在 web api 2 中正确实现异步

类之间的 Python 传递变量

javascript - 在 Selenium 中滚动 webelement 后,值意外附加到列表

python - 使用 Python 解析(可能是非标准的)XML