Process.StandardOutput.Readline() 在Mono上挂起,但在.NET上正常
我正在尝试让一个在Mono(Ubuntu系统上)运行的C#程序去调用一个Python脚本,向它的标准输入(stdin)发送数据,并从它的标准输出(stdout)读取数据。下面的测试代码展示了这个基本思路:
var startInfo = new ProcessStartInfo("python");
startInfo.Arguments = "./hello.py";
startInfo.UseShellExecute = false;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
var p = Process.Start(startInfo);
if(p.HasExited)
return;
p.StandardInput.WriteLine("Bob");
var result = p.StandardOutput.ReadLine();
Console.WriteLine("Result: {0}", result);
hello.py的代码非常简单:
#!/usr/bin/python
line = raw_input()
while len(line) > 0:
print("Hello " + line)
line = raw_input()
当我在.NET/Windows上执行这个测试代码时,结果如预期那样,返回了“Hello Bob”。但是在Mono/Linux上,C#程序在调用p.StandardOutput.ReadLine();
时就卡住了。你知道为什么在Mono/Linux上不行吗?我需要做什么修改才能让它正常工作呢?
1 个回答
1
我来回答我自己的问题……结果发现这和Mono或Linux没有关系,而是Python在Windows和Linux上的表现不同。要在Linux上让它正常工作,需要用 -u 这个参数来启动Python(表示不使用缓冲输出),这样打印的数据才能及时显示到屏幕上。感谢Mono邮件列表上的“weeble”提供的这个建议!