Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running python script on C# and getting output continuously

Tags:

c#

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)
like image 397
Terry Anderson Avatar asked Mar 30 '26 22:03

Terry Anderson


1 Answers

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.

like image 67
Ehsan.Saradar Avatar answered Apr 02 '26 03:04

Ehsan.Saradar