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

2 投票
1 回答
740 浏览
提问于 2025-04-17 14:43

我正在尝试让一个在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”提供的这个建议!

撰写回答