Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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#/IronPython_C#_Embed_Ironpython - Fatal编程技术网

编译所有文件C#/IronPython

编译所有文件C#/IronPython,c#,embed,ironpython,C#,Embed,Ironpython,我将IronPython嵌入到C#中,作为修改我正在编写的程序的一种方式。因此,需要同时使用多个文件 Code = ""; Engine = Python.CreateEngine(); Runtime = Engine.Runtime; var files = Directory.GetFiles("script", "*.py", SearchOption.AllDirectories); foreach (va

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

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

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

此文件使用在B.py和C.py中定义的模块BC

B.py:

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

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);
var paths = engine.GetSearchPaths();
paths.Add("scripts");
engine.SetSearchPaths(paths);
请注意,只需加载A.py(作为主入口点),其他所有内容都将由运行时解决

如果脚本被拆分为多个文件夹,则可能需要相应地更改搜索路径。假设除A.py之外的所有文件都位于名为scripts的文件夹中

var engine = Python.CreateEngine();
var scope = engine.CreateScope();
var source = engine.CreateScriptSourceFromFile("A.py");
source.Execute(scope);
var paths = engine.GetSearchPaths();
paths.Add("scripts");
engine.SetSearchPaths(paths);
请注意,如果出于某种原因,您希望在使用类时避免使用模块名称空间,还可以导入*。这对于某些用例来说可能更容易,但可能会产生命名冲突(例如,如果AB都将定义一个类Foo


我的python脚本彼此不交互,只与C部分交互。我是否需要拥有/生成一个导入所有内容的python脚本?这取决于它们如何“与C#部分交互”。如果脚本一加载就“使用.NET执行某些操作”,则必须从.NET或python加载脚本。python脚本在运行时可能不会相互交互,但它们中的类/类型相互依赖。是否可以拆分为包含入口点和库脚本的文件?或者有某种定义的输入函数可以从.net调用?然后,您可以从.net加载它们并获取入口函数?或者脚本是否表示某种附加到.NET接口/events/的扩展/插件?如果您只希望所有声明的模块/类/函数都在您的作用域中,那么您也可以执行
Directory.GetFiles(“.”,“*.py”).ToList().ForEach(f=>engine.ExecuteFile(f,scope))。我正在使用python中从.NET定义的类(通过C#的dynamic关键字)。我已经用您的代码替换了我的代码,但不幸的是,我似乎无法导入模块(ImportException)。它们位于与二进制文件不同的目录中,在/script文件夹中。然后,您必须提供正确的搜索路径。我在回答中添加了一些信息。
var paths = engine.GetSearchPaths();
paths.Add("scripts");
engine.SetSearchPaths(paths);
from B import *
from C import *
foo = Foo()
bar = Bar()