将 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
这很可能是我写过的最长的帖子之一,所以感谢您花时间阅读它,希望我能解决这个问题。
干杯
事实证明,我传递的格式是错误的。我使用的是 Postman REST API 客户端,将大量数据粘贴到他们的请求内容窗口中会截断它,只剩下半行。一旦解决了这个问题,一切都顺利进行。