标签:ironpython c
我只想使用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文档中它存在.
附言关闭方法也一样!!!
任何想法?
解决方法:
我只能告诉您如何使您的代码正常工作,但是我对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);
}
标签:ironpython,c 来源: https://codeday.me/bug/20191118/2029266.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。