Skip to main content
 首页 » 编程设计

python之Process.StandardOutput.Readline() 卡在 Mono 而不是 .NET

2025年05月04日9小虾米

我正在尝试让一个在 Mono(在 Ubuntu 上)上运行的 C# 程序调用一个 python 脚本,将数据发送到它的标准输入,并从它的标准输出读回数据。下面的测试代码捕获了基本思想:

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 上运行吗?我需要更改什么才能使其运行?

请您参考如下方法:

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