立即从 cmd 获取结果,无需等待执行结束 python 脚本
Get result from cmd instantly without wait for end of execuction python script
我想通过 cmd 实时获得执行 python 脚本的结果。
我的带有启动 pyhton 脚本的 C# 代码:
static void cmd_DataReceived(object sender, DataReceivedEventArgs e)
{
// Console.WriteLine("Output from other process");
Console.WriteLine(e.Data);
}
static void cmd_Error(object sender, DataReceivedEventArgs e)
{
// Console.WriteLine("Error from other process");
Console.WriteLine(e.Data);
}
private void backgroundWorker_sizzer_DoWork(object sender, DoWorkEventArgs e)
{
ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
cmdStartInfo.RedirectStandardOutput = true;
cmdStartInfo.RedirectStandardError = true;
cmdStartInfo.RedirectStandardInput = true;
cmdStartInfo.UseShellExecute = false;
cmdStartInfo.CreateNoWindow = true;
Process cmdProcess = new Process();
cmdProcess.StartInfo = cmdStartInfo;
cmdProcess.ErrorDataReceived += cmd_Error;
cmdProcess.OutputDataReceived += cmd_DataReceived;
cmdProcess.EnableRaisingEvents = true;
cmdProcess.Start();
cmdProcess.BeginOutputReadLine();
cmdProcess.BeginErrorReadLine();
cmdProcess.StandardInput.WriteLine("cd C:\Users\");
cmdProcess.StandardInput.WriteLine("py test.py"); //Execute script
cmdProcess.StandardInput.WriteLine("exit"); //Execute exit.
cmdProcess.WaitForExit();
}
test.py 文件包含简单示例:
import time
time.sleep(5) # Sleep for 5 seconds
print("hello")
time.sleep(10) # Sleep for 10 seconds
print("hello")
time.sleep(15) # Sleep for 15 seconds
print("hello")
time.sleep(1) # Sleep for 1 seconds
现在,当我 运行 backgroundworker 时,它会立即显示所有问候 - 当 python 脚本结束他的执行时。
我要的就是实时显示你好,一一显示。当我通过 cmd 手动启动它时,它运行良好,并实时一一显示“你好”。
问题与 python 中的 IO 缓冲有关,因为您在 C# 中调用进程并等待它完成,然后再读取输出缓冲区。
尝试在每次打印后刷新 python 代码中的缓冲区:
sys.stdout.flush()
我想通过 cmd 实时获得执行 python 脚本的结果。
我的带有启动 pyhton 脚本的 C# 代码:
static void cmd_DataReceived(object sender, DataReceivedEventArgs e)
{
// Console.WriteLine("Output from other process");
Console.WriteLine(e.Data);
}
static void cmd_Error(object sender, DataReceivedEventArgs e)
{
// Console.WriteLine("Error from other process");
Console.WriteLine(e.Data);
}
private void backgroundWorker_sizzer_DoWork(object sender, DoWorkEventArgs e)
{
ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
cmdStartInfo.RedirectStandardOutput = true;
cmdStartInfo.RedirectStandardError = true;
cmdStartInfo.RedirectStandardInput = true;
cmdStartInfo.UseShellExecute = false;
cmdStartInfo.CreateNoWindow = true;
Process cmdProcess = new Process();
cmdProcess.StartInfo = cmdStartInfo;
cmdProcess.ErrorDataReceived += cmd_Error;
cmdProcess.OutputDataReceived += cmd_DataReceived;
cmdProcess.EnableRaisingEvents = true;
cmdProcess.Start();
cmdProcess.BeginOutputReadLine();
cmdProcess.BeginErrorReadLine();
cmdProcess.StandardInput.WriteLine("cd C:\Users\");
cmdProcess.StandardInput.WriteLine("py test.py"); //Execute script
cmdProcess.StandardInput.WriteLine("exit"); //Execute exit.
cmdProcess.WaitForExit();
}
test.py 文件包含简单示例:
import time
time.sleep(5) # Sleep for 5 seconds
print("hello")
time.sleep(10) # Sleep for 10 seconds
print("hello")
time.sleep(15) # Sleep for 15 seconds
print("hello")
time.sleep(1) # Sleep for 1 seconds
现在,当我 运行 backgroundworker 时,它会立即显示所有问候 - 当 python 脚本结束他的执行时。
我要的就是实时显示你好,一一显示。当我通过 cmd 手动启动它时,它运行良好,并实时一一显示“你好”。
问题与 python 中的 IO 缓冲有关,因为您在 C# 中调用进程并等待它完成,然后再读取输出缓冲区。
尝试在每次打印后刷新 python 代码中的缓冲区:
sys.stdout.flush()