从c#操作Python文件

本文关键字:文件 Python 操作 | 更新日期: 2023-09-27 18:12:50

我正在为我正在制作的游戏开发一些工具。这些工具可以作为前端,让编辑游戏文件变得更容易。其中一些文件是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. 查找并列出所有创建的项目(在这种情况下只有一个),大量的晶体)。我需要找到这个的类型caseScriptedItem)和所有参数值
  3. 允许编辑参数和创建/删除项目。

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

经过搜索,我发现IronPython可以很容易地解析python文件,所以这就是我要做的。一旦我构建了抽象语法树,我就使用PythonWalkers来识别和查找我需要的所有信息。这对于读入数据非常有效,但是我没有看到将更新的数据推入Python文件的简单方法。据我所知,无法更改AST中的值,更不用说将AST转换回脚本文件了。如果我错了,我希望有人能告诉我该怎么做。我现在需要做的是搜索文件,直到找到正确的行,然后尝试将数据推入构造函数,确保正确的顺序。

有没有我没看到的明显的解决办法?我是否应该继续改进我的解析器,使其支持更复杂的数据类型?我真的以为我已经有了IronPython解析器,但我没有想到将修改过的数据推回文件是多么棘手。

任何建议都将受到欢迎

从c#操作Python文件

您需要一个源到源的程序转换工具

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

这样的程序转换工具必须将文本解析为ast,并将"反解析"(称为"Prettyprint")ast解析为文本。如果IronPython有一个漂亮的打印机,这就是你需要的。如果没有,你可以用一些(也许是很多)努力建立一个;正如你所观察到的,这并不像人们想象的那么容易。看看我的答案将AST编译回源代码

如果这不起作用,我们的带有Python前端的DMS Software Reengineering Toolkit可能会奏效。它具有以上所有的性质。

如果你能找到一个完整的和最新的上下文无关的Python语法文件,你可以使用CoCo/R解析器生成器在c#中生成一个Python解析器。

你可以将产品代码添加到语法文件本身来填充c#应用程序中的数据结构。该数据结构可以包含你需要的所有信息(方法及其参数,属性,构造函数,析构函数等)。一旦你有了这个数据结构,接下来的任务就是为用户设计一个前端,并以一种使用户可以编辑的方式表示这个数据结构(这更像是一个设计任务,而不是一个复杂的编程任务)。

最后,遍历数据结构并写出一个.py文件。

您可以使用python inspect模块打印对象的源代码。以您的情况为例:打印模块的源代码-您刚刚用IronPython解析的文件。不过,我还没有检查过inspect是否适用于IronPython。

至于添加东西,嗯,它是一个模块,对吧?你可以把东西添加到模块中…我将加载模块,然后修改它,使用inspect查看打印它并保存到磁盘。

从你的帖子中,看起来你已经深入战壕并且玩得很开心,所以我真的很高兴在这里看到你如何解决这个问题的帖子!

对我来说,这听起来更像是你把它全部塞进sqlite数据库并开始以这种方式编辑它。连接一些表单来编辑表对于UI来说更简单。此时,您可以通过转储表并使用一些格式来提供周围的python脚本来生成新的python文件。

SVN/Git/whatever可以通过python文件合并更新的更改。

无论如何,这就是我最终为我的项目所做的。我开始使用python来使用它们的计算键连接各种项目,然后只是添加了一些表单UI,以避免在python文件中编辑错误。