1

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

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

4

1 回答 1

3

如果您将代码/文件构建为 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()
于 2013-01-21T09:00:00.170 回答