编译所有文件C#/ IronPython

时间:2013-01-21 06:29:10

标签: c# embed ironpython

我将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

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

1 个答案:

答案 0 :(得分:3)

如果您将代码/文件构造为python modules,导入并使用它们,python运行时将处理/解析您的导入和依赖项。 假设您的主要python文件包含 A.py

的主要入口点
import B, C
foo = B.Foo()
bar = C.Bar()

foo.foo()
bar.bar(foo)

print("done")

此文件使用 B.py C.py 中定义的模块 B C 。< / p>

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.py B.py C.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);

请注意,如果由于某种原因您希望在使用类时避免使用模块命名空间,则还可以导入*。对于某些用例,这可能更容易,但可能会产生命名冲突(例如,如果 A B 都会定义类 Foo )。< / p>

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