我正在尝试从 C# 运行一个 python 脚本,我想逐行而不是最后获得输出。我觉得我错过了一些重要的东西,但不知道是什么。这是我到目前为止:
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);
}
Run Code Online (Sandbox Code Playgroud)
和python代码:
import time
for i in range(5):
print("Hello World " + str(i))
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
将您的python代码更改为以下内容:
import time
import sys
for i in range(5):
print("Hello World " + str(i))
sys.stdout.flush()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
或者只是编辑您的 c# 代码并使用 -u 开关:
var cmd = "-u C:/Users/user/Documents/script.py";
Run Code Online (Sandbox Code Playgroud)
当标准输出被重定向时,在控制台上写入一行时不会引发 C# 中的事件,因为没有调用 stdout.flush;
在每个打印语句之后放置一个 stdout.flush() 语句会使事件按原样触发,C# 现在可以捕获输出。
或者你可以只使用 -u 开关。