我将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
我如何以正常方式编译所有文件?
答案 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()