我正在尝试运行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
这很可能是我发过的最长的帖子之一,所以感谢花时间阅读它,希望我能得到解决方案。
干杯
答案 0 :(得分:0)
原来我输入的格式是错误的。我正在使用Postman REST Api客户端,并将大量数据粘贴到他们的请求内容窗口中,将其截断,留给我半行。一旦对它进行了排序,一切都运行正常。