实时读取cmd输出
本文关键字:输出 cmd 读取 实时 | 更新日期: 2023-09-27 18:22:06
我正在编写一个程序,该程序读取python脚本输出并在文本框中显示结果。由于脚本运行了很长时间,我希望能够每1秒(或每行写入后)看到一次输出。现在我只能在进程结束时看到输出。有人知道问题出在哪里吗?
我的代码片段:
Process p = new Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.OutputDataReceived += new DataReceivedEventHandler (p_OutputDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler (p_ErrorDataReceived);
p.Exited += new EventHandler (p_Exited);
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "python.exe";
p.StartInfo.Arguments = "path " + commandline;
p.Start();
StreamReader s = p.StandardOutput;
String output = s.ReadToEnd();
textBox3.Text = output;
p.WaitForExit();
我在自己的程序中以以下方式进行:
private static void startProgram(
string commandLine )
{
var fileName = commandLine;
var arguments = string.Empty;
checkSplitFileName( ref fileName, ref arguments );
var info = new ProcessStartInfo();
info.FileName = fileName;
info.Arguments = arguments;
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
using ( var p = new Process() )
{
p.StartInfo = info;
p.EnableRaisingEvents = true;
p.OutputDataReceived += (s,o) => {
Console.WriteLine(o.Data);
};
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();
}
}
即,我正在订阅OutputDataReceived
事件并调用BeginOutputReadLine
方法。另请参阅类似的"堆栈溢出"问题。
(我上面源代码中的方法checkSplitFileName
可以在这里找到)
我在从C#运行Python脚本时也遇到了同样的问题。问题是Python缓冲stdout
(print())的输出。
你可以在这里做两件事中的一件。
1.
将以下内容添加到Python脚本中,在每行print()
之后刷新输出。
import sys
print('Hello World!')
sys.stdout.flush()
2.使用-u
命令行参数运行Python编译器。这样,您就不需要在每次打印后添加上面的齐平线。
...
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "python.exe -u path " + commandline;
...
因此,如果你想执行say hello.py,你可以执行:
python.exe-u hello.py
这是适用于我的C#代码。
Process p = new Process();
string op = "";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = "c:''python27''python.exe";
StreamReader outputStream = p.StandardOutput;
StreamReader errorStream = p.StandardError;
p.StartInfo.Arguments = @"-u hello.py";
p.Start();
string output = "";
int offset = 0, readBytes = 0;
char[] buffer = new char[512];
do
{
output = outputStream.ReadLine();
if (!string.IsNullOrEmpty(output))
{
txtOutput.AppendText(output);
txtOutput.AppendText(Environment.NewLine);
offset += readBytes;
Application.DoEvents();
}
Thread.Sleep(3);
} while (!p.HasExited);