将PythonScript作为进程运行并阅读标准输出问题

时间:2014-11-13 09:39:50

标签: c# python .net

我正在尝试运行python脚本作为一个进程,我传递了几个参数,然后读取标准输出。我有一个小的控制台应用程序和一个工作正常的虚拟脚本,但是当我在WebApi项目中做同样的事情时,标准输出总是空白的,我无法弄清楚原因。我的代码如下:

控制台应用

class Program
    {
       private static string Foo(string inputString)
       {
           string result = String.Empty;
           ProcessStartInfo start = new ProcessStartInfo();
           start.FileName = "python";
           start.Arguments = string.Format(" {0} {1} {2}", @"*path*\runner.py", @"*path*\test2.py", inputString);
           start.UseShellExecute = false;
           start.RedirectStandardOutput = true;
           using (Process process = Process.Start(start))
           {
               using (StreamReader reader = process.StandardOutput)
               {
                   result = reader.ReadToEnd();
               }
           }
           return result;
       }

       static void Main(string[] args)
       {
           var result = Foo("flibble");
           Console.Write(result);
           Console.ReadKey();
       }
    }

runner.py(适用于控制台应用)

import sys, imp

test = imp.load_source('test',sys.argv[1])
result = test.hello(sys.argv[2])

test2.py(来自控制台应用)

import sys

def hello(inputString):
   sys.stdout.write(inputString)
   return

这就是我所拥有的工作的结束,现在是问题所在的代码:

ApiEndpoint

  [HttpPost]
        public IHttpActionResult TestEndpoint()
        {
            string postedJson = ReadRawBuffer().Result;
            if (postedJson == null) throw new ArgumentException("Request is null");
            var result = _pythonOperations.Foo(postedJson);
            // Deal with result
            return Ok();
        }

_pythonOperations.Foo()

  public string Foo(string inputString)
        {
            string result;
            var start = new ProcessStartInfo
            {
                FileName = _pathToPythonExecutable,
                Arguments = string.Format(" {0} {1} {2}", _pathToPythonRunnerScript, _pathToPythonFooScript, inputString),
                UseShellExecute = false,
                RedirectStandardOutput = true
            };
            using (Process process = Process.Start(start))
            {
                using (StreamReader reader = process.StandardOutput)
                {
                    result = reader.ReadToEnd();
                }
            }
            return result;
        }

pythonRunnerScript

import sys, imp

module = imp.load_source('foo', sys.argv[1])
module.Foo(sys.argv[2])

Foo脚本

import sys

def Foo(inputString)
    outputString = "output"
    sys.stdout.write(outputString)
    return

这很可能是我发过的最长的帖子之一,所以感谢花时间阅读它,希望我能得到解决方案。

干杯

1 个答案:

答案 0 :(得分:0)

原来我输入的格式是错误的。我正在使用Postman REST Api客户端,并将大量数据粘贴到他们的请求内容窗口中,将其截断,留给我半行。一旦对它进行了排序,一切都运行正常。