Process.StandardOutput.Readline()在Mono上挂起但在.NET上挂起

时间:2013-02-04 18:24:55

标签: python mono stdout stdin

我试图让一个在Mono上运行的C#程序(在Ubuntu上)调用一个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 个答案:

答案 0 :(得分:1)

回答我自己的问题......原来这与Mono或Linux无关,而是与Windows在Linux上的行为有关。要使它在Linux上运行,需要使用-u标志(无缓冲输出)调用Python,以便将打印的数据实际刷新到stdout。感谢Mono邮件列表中的“weeble”提示!