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

本文关键字:读取 标准 输出 出问题 运行 PythonScript 进程 | 更新日期: 2023-09-27 18:30:16

我正在尝试将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.福()

  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])

福脚本

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

这很可能是我写过的最长的帖子之一,所以感谢您花时间阅读它,希望我能解决这个问题。

干杯

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

事实证明,我传递的格式是错误的。我使用的是 Postman REST API 客户端,将大量数据粘贴到他们的请求内容窗口中会截断它,只剩下半行。一旦解决了这个问题,一切都顺利进行。