如何在c#中执行并返回python脚本的结果?

时间:2014-11-16 06:08:09

标签: c# asp.net python-2.7

如何在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可能对我不起作用。

1 个答案:

答案 0 :(得分:1)

好的,由于评论中的一些线索,我弄清楚问题是什么。主要是python.exe和myscript.py路径中的空格。结果我不需要-iprocess.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错误和输出。