如何在c#中执行并返回python脚本的结果?
我正在尝试从我的控制器运行python脚本。
我在使用virtualenv
命令创建的虚拟环境文件夹中设置了python.exe。
所以仅仅为了测试目的,我想从我的phython脚本返回结果字符串:
# myscript.py
print "test"
并在我的asp.net mvc应用程序的视图中显示。
我从相关的stackoverflow question获得了run_cmd函数。 我已经尝试添加-i选项来强制交互模式并调用process.WaitForExit()而没有运气。
namespace NpApp.Controllers
{
public class HomeController : Controller
{
public ActionResult Index(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
ViewBag.textResult = run_cmd("-i C:/path/to/virtualenv/myscript.py", "Some Input");
return View();
}
private string run_cmd(string cmd, string args)
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = @"C:/path/to/virtualenv/Scripts/python.exe";
start.CreateNoWindow = true;
start.Arguments = string.Format("{0} {1}", cmd, args);
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
using (Process process = Process.Start(start))
{
using (StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
//Console.Write(result);
process.WaitForExit();
return result;
}
}
}
}
}
似乎myscript.py从未运行过。但是在我看来,我没有错误,只是一个空白变量。
编辑:
我曾尝试简化上述内容,因为我认为解释并获得答案会更容易。最后我需要使用一个名为“nameparser”的包,并将传递的name参数的结果存储到数据库中。但是,如果我可以让run_cmd返回一个字符串,我想我可以处理其余部分。这就是为什么我认为评论中提到的其余api和IronPython可能对我不起作用。
答案 0 :(得分:1)
好的,由于评论中的一些线索,我弄清楚问题是什么。主要是python.exe和myscript.py路径中的空格。结果我不需要-i
或process.WaitForExit()
。我只是将python虚拟环境移动到没有空格的路径中,一切都开始工作了。还要确保myscript.py文件是可执行的。
这真的很有帮助:
string stderr = process.StandardError.ReadToEnd();
string stdout = process.StandardOutput.ReadToEnd();
Debug.WriteLine("STDERR: " + stderr);
Debug.WriteLine("STDOUT: " + stdout);
它显示了Visual Studio中“输出”窗格中的python错误和输出。