Python C# 应用程序中的脚本 - IO 问题
Python script in C# application - IO problems
我正在尝试在我的 C# 应用程序中嵌入著名的 speedtest-cli.py(speedtest.net 客户端),这样我就可以在控制台或 texbox 中显示输出。
到目前为止,我尝试了以下操作:
class PythonSpeedTest
{
private String path = @"c:\pythonSpeedTest.py";
public void runPython() {
var py = Python.CreateEngine();
var scope = py.CreateScope();
var paths = py.GetSearchPaths();
paths.Add(@"C:\Program Files (x86)\IronPython 2.7\Lib");
py.SetSearchPaths(paths);
MemoryStream ms = new MemoryStream();
py.Runtime.IO.SetOutput(ms, new StreamWriter(ms));
try
{
var output = py.ExecuteFile(path, scope);
}
catch (Exception ex)
{
Console.WriteLine("Python collapsed" + ex.Message);
}
Thread.Sleep(5000);
var sr = new StreamReader(ms);
var result = sr.ReadToEnd();
Console.WriteLine(result);
}
}
应用程序似乎运行脚本,但是
1.它不会等到它完成,并且
2. 我无法让它显示 python
的任何输出
理想情况下,我需要能够等到 python 完成测试;捕获结果并将其输出到控制台或 TextBox 中,或者如果我可以捕获所有输出 - 那就太棒了。
感谢帮助!
好的!!!几天后,我终于想通了。首先,我不必设置任何流即可从 python 获得输出。这是代码:
class testPython
{
public void runScript() {
String path = @"c:\pythonSpeedTest.py";
var source = System.IO.File.ReadAllText(path);
Microsoft.Scripting.Hosting.ScriptEngine py = Python.CreateEngine();
Microsoft.Scripting.Hosting.ScriptScope scope = py.CreateScope();
var paths = py.GetSearchPaths();
paths.Add(@"c:\Program Files (x86)\IronPython 2.7\Lib");
py.SetSearchPaths(paths);
try {
py.Execute(source);
}catch (Exception ex){
Console.WriteLine("Error occured in python script\n"+ex);
Console.ReadKey();
return;
}
}
}
重要的是为 python 引擎设置路径。主要问题是我已经 运行 在 canopy 中按下播放按钮的脚本(抱歉我是个菜鸟),但在脚本本身我从来没有简单地调用 main()。一旦我添加它 - 脚本在我的 C# 应用程序下很好地执行。现在获取数据会很容易。
希望这会节省一些时间!
我正在尝试在我的 C# 应用程序中嵌入著名的 speedtest-cli.py(speedtest.net 客户端),这样我就可以在控制台或 texbox 中显示输出。
到目前为止,我尝试了以下操作:
class PythonSpeedTest
{
private String path = @"c:\pythonSpeedTest.py";
public void runPython() {
var py = Python.CreateEngine();
var scope = py.CreateScope();
var paths = py.GetSearchPaths();
paths.Add(@"C:\Program Files (x86)\IronPython 2.7\Lib");
py.SetSearchPaths(paths);
MemoryStream ms = new MemoryStream();
py.Runtime.IO.SetOutput(ms, new StreamWriter(ms));
try
{
var output = py.ExecuteFile(path, scope);
}
catch (Exception ex)
{
Console.WriteLine("Python collapsed" + ex.Message);
}
Thread.Sleep(5000);
var sr = new StreamReader(ms);
var result = sr.ReadToEnd();
Console.WriteLine(result);
}
}
应用程序似乎运行脚本,但是 1.它不会等到它完成,并且 2. 我无法让它显示 python
的任何输出理想情况下,我需要能够等到 python 完成测试;捕获结果并将其输出到控制台或 TextBox 中,或者如果我可以捕获所有输出 - 那就太棒了。
感谢帮助!
好的!!!几天后,我终于想通了。首先,我不必设置任何流即可从 python 获得输出。这是代码:
class testPython
{
public void runScript() {
String path = @"c:\pythonSpeedTest.py";
var source = System.IO.File.ReadAllText(path);
Microsoft.Scripting.Hosting.ScriptEngine py = Python.CreateEngine();
Microsoft.Scripting.Hosting.ScriptScope scope = py.CreateScope();
var paths = py.GetSearchPaths();
paths.Add(@"c:\Program Files (x86)\IronPython 2.7\Lib");
py.SetSearchPaths(paths);
try {
py.Execute(source);
}catch (Exception ex){
Console.WriteLine("Error occured in python script\n"+ex);
Console.ReadKey();
return;
}
}
}
重要的是为 python 引擎设置路径。主要问题是我已经 运行 在 canopy 中按下播放按钮的脚本(抱歉我是个菜鸟),但在脚本本身我从来没有简单地调用 main()。一旦我添加它 - 脚本在我的 C# 应用程序下很好地执行。现在获取数据会很容易。
希望这会节省一些时间!