Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C操作Python文件#_C#_Python_Parsing_Ironpython - Fatal编程技术网

C# 从C操作Python文件#

C# 从C操作Python文件#,c#,python,parsing,ironpython,C#,Python,Parsing,Ironpython,我正在为我正在制作的游戏开发一些工具。这些工具充当前端,使编辑游戏文件更容易。其中有几个文件是python脚本文件。例如,我有一个Items.py文件,其中包含以下内容(例如最小化) 正如我提到的,我想提供一个前端来编辑这个文件,而不需要让编辑器知道python/直接编辑这个文件。我的编辑需要能够: 查找并列出所有的类类型(在本例中,它只是 脚本项) 查找并列出所有创建的项目(在这种情况下,只有一个, 丰富的晶体)。我需要找到类型(在这个 caseScriptedItem)和所有参数值 允许编辑

我正在为我正在制作的游戏开发一些工具。这些工具充当前端,使编辑游戏文件更容易。其中有几个文件是python脚本文件。例如,我有一个Items.py文件,其中包含以下内容(例如最小化)

正如我提到的,我想提供一个前端来编辑这个文件,而不需要让编辑器知道python/直接编辑这个文件。我的编辑需要能够:

  • 查找并列出所有的类类型(在本例中,它只是 脚本项)
  • 查找并列出所有创建的项目(在这种情况下,只有一个, 丰富的晶体)。我需要找到类型(在这个 caseScriptedItem)和所有参数值
  • 允许编辑参数和创建/删除项目
  • 为此,我开始编写自己的解析器,查找class关键字以及这些记录的类何时用于构造对象。这对简单数据有效,但当我开始使用具有复杂构造函数(列表、映射等)的类时,正确解析变得越来越困难

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

    有什么明显的解决办法我看不到吗?我是否应该继续使用解析器并使其支持更复杂的数据类型?我真的认为我使用了IronPython解析器,但我没有想到将修改后的数据推回到文件中会有多么棘手


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

    您需要一个消息源到另一个消息源

    这样的工具将语言解析为内部数据结构(始终是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))