编译所有c# /IronPython文件

本文关键字:IronPython 文件 编译 | 更新日期: 2023-09-27 17:54:38

我将IronPython嵌入到c#中,以修改我正在开发的程序。因此,需要同时使用多个文件。

        Code = "";
        Engine = Python.CreateEngine();
        Runtime = Engine.Runtime;
        var files = Directory.GetFiles("script", "*.py", SearchOption.AllDirectories);
        foreach (var tr in files.Select(file => new StreamReader(file)))
        {
            Code += "'n";
            Code += tr.ReadToEnd();
            tr.Close();
        }
        Scope = Engine.CreateScope();
        Engine.CreateScriptSourceFromString(AddImports(Code)).Execute(Scope);

这将/script中的所有文件组合成一个字符串,并从它们创建一个脚本源,当然,这是一个有缺陷的方法,因为如果类不是按字母顺序继承的,就会发生UnboundNameException

class bar(foo):
    pass
class foo():
    pass

我如何以正常的方式编译所有的文件?

编译所有c# /IronPython文件

如果你将代码/文件结构为python模块,导入并使用它们,python运行时将处理/解析你的导入和依赖项。假设你有一个主要的python文件,其中包含主入口点A.py

import B, C
foo = B.Foo()
bar = C.Bar()
foo.foo()
bar.bar(foo)
print("done")

该文件使用B.pyC.py中定义的模块BC

B.py:

class Foo:
    def foo(self):
        print("Foo.foo()")

C.py(注意模块C也使用/导入模块B):

import B
class Bar:
    def bar(self, foo):
        print("Bar.bar()")
用于设置引擎和执行一切的。net样板(假设A.pyB.pyC.py与。net二进制文件位于同一目录或路径上)看起来像
var engine = Python.CreateEngine();
var scope = engine.CreateScope();
var source = engine.CreateScriptSourceFromFile("A.py");
source.Execute(scope);

请注意,只有A.py(作为主入口点)必须加载,其他所有内容将由运行时解析。

如果您的脚本被分成多个文件夹,您可能需要相应地更改搜索路径。假设除了A.py以外的所有文件都位于名为scripts的文件夹中,该文件夹看起来像

var paths = engine.GetSearchPaths();
paths.Add("scripts");
engine.SetSearchPaths(paths);

请注意,如果出于某种原因,您希望在使用类时避免模块命名空间,您也可以导入*。这对于某些用例可能更容易,但可能会产生命名冲突(例如,如果AB将定义一个类Foo)。

from B import *
from C import *
foo = Foo()
bar = Bar()