在C#和Python之间传递变量(IronPython?)

时间:2018-10-31 09:26:37

标签: c# python .net

我正在尝试从C#应用程序传递一个变量,该变量被用作API连接。

基本上,Outsystems会产生一个信号,C#应用程序会拾取该信号。然后,我想将此变量(单整数)传递到我的python代码(在下面的代码中标记为msg)上,以便它可以使用它运行函数。

我已经研究过了,看来Ironpython有解决方案了:

{
    ScriptRuntimeSetup setup = Python.CreateRuntimeSetup(null);
    ScriptRuntime runtime = new ScriptRuntime(setup);
    ScriptEngine engine = Python.GetEngine(runtime);
    ScriptSource source = engine.CreateScriptSourceFromFile("C:\\Scripts\\12\\Testpy\\Testpy\\Testpy.py");
    ScriptScope scope = engine.CreateScope();
    List<String> argv = new List<String>();
    //Do some stuff and fill argv
    argv.Add(msg);
    engine.GetSysModule().SetVariable("argv", argv);
    source.Execute(scope);
}

但是,当它获得source.Execute(scope)端时,它似乎什么也不做(没有错误,只是停止执行)。

我想(?)是因为我的python代码尚未设置为接收变量。但是,这是我不确定如何编写的部分。

不幸的是,我-将值传递到python脚本中的经验很少,但建立了以下简单的示例(从python脚本到python脚本),似乎很正常:

pyA

import pyB

pyB.some_func(2)

pyB

def some_func(a):
    print(a)

some_func()

或者,如果有人可以推荐另一种非Iron Python的方法,那也将是惊人的!

提前谢谢!!非常感谢!

1 个答案:

答案 0 :(得分:0)

来自此vid中的代码链接:https://www.w3schools.com/xml/tryit.asp?filename=tryajax_xmlhttp

    var psi = new ProcessStartInfo();
    psi.FileName = @"C:\PythonInstall\python.exe";

    // 2) Provide script and arguments
    var script = @"C:\AllTech\Code\DaysBetweenDates.py";
    var start = "2019-1-1";
    var end = "2019-1-22";

    psi.Arguments = $"\"{script}\" \"{start}\" \"{end}\"";

    // 3) Process configuration
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;

    // 4) Execute process and get output
    var errors = "";
    var results = "";

    using(var process = Process.Start(psi))
    {
        errors = process.StandardError.ReadToEnd();
        results = process.StandardOutput.ReadToEnd();
    }

    // 5) Display output
    Console.WriteLine("ERRORS:");
    Console.WriteLine(errors);
    Console.WriteLine();
    Console.WriteLine("Results:");
    Console.WriteLine(results);