我试图让一个在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,我需要改变它才能使它工作吗?
答案 0 :(得分:1)
回答我自己的问题......原来这与Mono或Linux无关,而是与Windows在Linux上的行为有关。要使它在Linux上运行,需要使用-u标志(无缓冲输出)调用Python,以便将打印的数据实际刷新到stdout。感谢Mono邮件列表中的“weeble”提示!