I'm trying to run a python script from C# and I want to get the output line by line and not at the end. I feel like I'm missing something important, but don't know what. This is what I have so far:
static void Main(string[] args)
{
var cmd = "C:/Users/user/Documents/script.py";
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "C:/Users/user/AppData/Local/Programs/Python/Python36/python.exe",
Arguments = cmd,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
},
EnableRaisingEvents = true
};
process.ErrorDataReceived += Process_OutputDataReceived;
process.OutputDataReceived += Process_OutputDataReceived;
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit();
Console.Read();
}
static void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data);
}
And the python code:
import time
for i in range(5):
print("Hello World " + str(i))
time.sleep(1)
change your python code to the following:
import time
import sys
for i in range(5):
print("Hello World " + str(i))
sys.stdout.flush()
time.sleep(1)
or just edit your c# code and use -u switch:
var cmd = "-u C:/Users/user/Documents/script.py";
When standard output it was being redirected, the event in C# wasn't being raised when a line was written on console because there were no calls to stdout.flush;
Putting a stdout.flush() statement after each print statement made the events fire as they should and C# now captures the output as it comes.
Or you could just use -u switch.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With