C# 从C操作Python文件#
我正在为我正在制作的游戏开发一些工具。这些工具充当前端,使编辑游戏文件更容易。其中有几个文件是python脚本文件。例如,我有一个Items.py文件,其中包含以下内容(例如最小化) 正如我提到的,我想提供一个前端来编辑这个文件,而不需要让编辑器知道python/直接编辑这个文件。我的编辑需要能够:C# 从C操作Python文件#,c#,python,parsing,ironpython,C#,Python,Parsing,Ironpython,我正在为我正在制作的游戏开发一些工具。这些工具充当前端,使编辑游戏文件更容易。其中有几个文件是python脚本文件。例如,我有一个Items.py文件,其中包含以下内容(例如最小化) 正如我提到的,我想提供一个前端来编辑这个文件,而不需要让编辑器知道python/直接编辑这个文件。我的编辑需要能够: 查找并列出所有的类类型(在本例中,它只是 脚本项) 查找并列出所有创建的项目(在这种情况下,只有一个, 丰富的晶体)。我需要找到类型(在这个 caseScriptedItem)和所有参数值 允许编辑
如有任何建议,我们将不胜感激您需要一个消息源到另一个消息源 这样的工具将语言解析为内部数据结构(始终是AST),允许您修改AST,然后可以从修改后的AST重新生成源文本,而无需更改源的任何内容,AST更改发生的位置除外 这样的程序转换工具必须将文本解析为AST,将AST“反解析”(称为“Prettyprint”)解析为文本。如果IronPython有一个预打印程序,那就是您所需要的。 如果没有,你可以用一些(也许很多)努力来构建一个;正如你所观察到的, 这并不像人们想象的那么容易。看到我的答案了吗
如果这不起作用,我们的its可能会起作用。它具有上述所有属性 如果您可以找到完整且最新的Python上下文无关语法文件,那么您可以使用parser generator在C#中生成Python解析器 您可以将生产代码添加到语法文件本身,以填充C#app中的数据结构。所述数据结构可以保存您需要的所有信息(方法及其参数、属性、构造函数、析构函数等)。一旦你有了这个数据结构,它只是一个为用户设计前端的任务,并以一种可编辑的方式表示这个数据结构(这是一个设计任务,而不是一个复杂的编程任务)
最后,遍历数据结构并写出一个.py文件。您可以使用python
inspect
模块打印对象的源代码。在您的例子中:打印模块的源代码——您刚才用IronPython解析的文件。不过,我还没有检查inspect是否与IronPython一起工作
至于添加东西,这是一个模块,对吗?您只需将内容添加到模块。。。我将加载模块,然后对其进行修改,使用inspect
查看、打印并保存到磁盘
从你的帖子来看,看起来你已经深陷战壕,玩得很开心,所以我真的很高兴在这里看到一篇关于你如何解决这个问题的帖子 对我来说,这听起来更像是将所有内容都放入sqlite数据库并开始以这种方式进行编辑。连接一些表单以编辑表对于UI来说更简单。在这一点上,您可以通过转储带有一些格式的表来生成新的python文件,以提供周围的python脚本 SVN/Git/任何东西都可以通过python文件合并更新的更改 无论如何,这就是我最终为我的项目所做的。我开始使用python使用计算键连接各种项目,然后添加一些表单UI以避免python文件中的编辑错误
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))