C# 和 IronPython 集成

标签 c# ironpython

我只想使用 C# 中的 io.py 编写一个文件,我使用以下代码:

using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
...

System.IO.Directory.SetCurrentDirectory(
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) +
"\IronPython\Lib");

ScriptRuntime py = Python.CreateRuntime();
dynamic io = py.UseFile("io.py");
dynamic f = io.open("tmp.txt", "w");

f.writelines("some text...");
f.close();

但是当我运行程序时,运行时会给我一个:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException 告诉写行没有重载接受参数“1”

似乎该方法不存在...但在 io.py 文档中它存在。

附言close 方法也是如此!!!

有什么想法吗?

最佳答案

我只能告诉您如何使您的代码工作,但是我对 IronPython 没有太多经验,也不知道为什么要这样做(尽管我尝试学习)。首先,似乎 io 模块以特殊方式处理,并且有专门的(非动态)类。当您执行 io.open 时,返回的是 PythonIOModule._IOBase 类的实例。你可以做

var f = (PythonIOModule._IOBase) io.open("tmp.txt", "w");

您自己看看“writeline”方法(这是常规方法,不是动态方法)接受 CodeContext 实例作为第一个参数,第二个参数是行。有趣的是,此类本身已经包含具有该 CodeContext 的字段,但由于某种原因它是内部的,更糟糕​​的是 - 写入行(和其他方法)可能一直在使用该 CodeContext 而不需要我们提供外部的。为什么要这样做 - 我不知道。

因此,为了让您的代码正常工作,我们必须在某个地方获取 CodeContext。一种方法是通过反射来做到这一点:

var context = (CodeContext) f.GetType().GetField("context", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(f);

另一种方法是自己制作:

var languageContext = HostingHelpers.GetLanguageContext(engine);
var context = new ModuleContext(io._io, new PythonContext(languageContext.DomainManager, new Dictionary<string, object>())).GlobalContext;

这两种方法都有效,程序将成功写入文件。完整的工作示例:

static void Main(string[] args) {                        
    System.IO.Directory.SetCurrentDirectory(@"G:\Python27\Lib");
    var engine = Python.CreateEngine();            
    dynamic io = engine.ImportModule("io");            
    var  f = (PythonIOModule._IOBase) io.open("tmp.txt", "w");
    var languageContext = HostingHelpers.GetLanguageContext(engine);
    var context = new ModuleContext(io._io, new PythonContext(languageContext.DomainManager, new Dictionary<string, object>())).GlobalContext;            
    f.writelines(context, "some text....");
    f.close(context);
}

关于C# 和 IronPython 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37569411/

相关文章:

visual-studio-2010 - IronPython:IronPython Interactive 中的随机导入失败

c# - 为什么 .ToList() 与 Cast 相比是瓶颈?示例代码如下

c# - ASP .Net MVC 4,键 'attachdbfilename' 的值无效

c# - 从 Assets 中读取文本文件的问题(xamarin)

c# - 像 google plus 一样在 C# 中模糊图像

c# - c#中的虚拟内存地址管理

c# - 找不到 IronPython sys._getframe

.net - IronPython 与原始 Python 的比较。我对第一个有什么期望?

c# - 停止正在运行的线程的安全方法是什么?

C# - 将数字四舍五入为 0 位小数