我一直在研究一个问题,现在我似乎无法解决,所以我需要一些帮助!问题是我正在用C#编写一个程序,但是我需要一个来自我创建的Python文件的函数。这本身就没有问题:
...Usual Stuff
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
namespace Program
{
public partial class Form1 : Form
{
Microsoft.Scripting.Hosting.ScriptEngine py;
Microsoft.Scripting.Hosting.ScriptScope s;
public Form1()
{
InitializeComponent();
py = Python.CreateEngine(); // allow us to run ironpython programs
s = py.CreateScope(); // you need this to get the variables
}
private void doPython()
{
//Step 1:
//Creating a new script runtime
var ironPythonRuntime = Python.CreateRuntime();
//Step 2:
//Load the Iron Python file/script into the memory
//Should be resolve at runtime
dynamic loadIPython = ironPythonRuntime.;
//Step 3:
//Invoke the method and print the result
double n = loadIPython.add(100, 200);
numericUpDown1.Value = (decimal)n;
}
}
}
但是,这需要将文件'first.py'作为程序编译后的任何位置。因此,如果我想分享我的程序,我将不得不发送可执行文件和python文件,这是非常不方便的。我想解决这个问题的一种方法是将'first.py'文件添加到资源并从那里运行......但我不知道如何做到这一点,或者即使它是可能的。
当然上面的代码不适用于此。因为.UseFile方法采用字符串参数而不是byte []。有谁知道我会如何进步?
答案 0 :(得分:2)
让我们从可能有效的最简单的事情开始,你有一些看起来有点像下面的代码:
// ...
py = Python.CreateEngine(); // allow us to run ironpython programs
s = py.CreateScope(); // you need this to get the variables
var ironPythonRuntime = Python.CreateRuntime();
var x = py.CreateScriptSourceFromFile("SomeCode.py");
x.Execute(s);
var myFoo = s.GetVariable("myFoo");
var n = (double)myFoo.add(100, 200);
// ...
我们想用其他内容替换var x = py.CreateScriptSourceFromFile(...
行;如果我们可以将嵌入资源作为字符串获取,我们可以使用ScriptingEngine.CreateScriptSourceFromString()
。
Cribbing this fine answer,我们可以得到一些看起来像这样的东西:
string pySrc;
var resourceName = "ConsoleApplication1.SomeCode.py";
using (var stream = System.Reflection.Assembly.GetExecutingAssembly()
.GetManifestResourceStream(resourceName))
using (var reader = new System.IO.StreamReader(stream))
{
pySrc = reader.ReadToEnd();
}
var x = py.CreateScriptSourceFromString(pySrc);