c# - 捕获 python 程序的标准输出

标签 c# python redirectstandardoutput

我正在尝试编写一个 C# 程序来捕获 python 程序中的标准输出。我的问题是所有输出都是在程序执行之后而不是在它实际发生时出现的。例如,对于这个 python 程序:

print "Hello"
time.sleep(2)
print "Hello"

我希望得到“你好”,间隔两秒,然后是另一个“你好”。实际结果是两秒钟的间隔,然后是“你好”、“你好”。

如果我从命令行运行上面的 python 脚本,我会得到所需的行为。如果命令提示符可以执行此操作,那么我应该能够模仿该功能而无需重复刷新缓冲区。

我正在使用它从 C# 运行进程:

_proc = new Process
            {
                StartInfo = new ProcessStartInfo
                                {
                                    FileName = "C:\\Python27\\python.exe",
                                    Arguments = pyScript,
                                    RedirectStandardError = true,
                                    UseShellExecute = false,
                                    RedirectStandardOutput = true,
                                    CreateNoWindow = true
                                }
            };
_proc.OutputDataReceived += ProcOnOutputDataReceived;
_proc.Start(); 
_proc.BeginOutputReadLine();

我可以运行此 C# 代码(并更改上面的 ProcessStartInfo 属性以运行 C# 可执行文件)并且它的行为正确:

Console.WriteLine("Hello");
Thread.Sleep(2000);
Console.WriteLine("Hello");

通过这段代码,我得到“Hello”,间隔两秒,然后是另一个“Hello”。

知道为什么吗?我怎样才能让 python 解释器在它发生时发送标准输出?

最佳答案

我知道这是旧的,但是使用 -u 选项(无缓冲)运行 python 似乎是您想要的。

Unbuffered 不会等待刷新输出。 在没有此选项的情况下运行 python,在以下情况下刷新输出:

  • 缓冲区已满
  • 您调用 sys.stdout.flush()
  • 流程结束

关于c# - 捕获 python 程序的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23229377/

相关文章:

c# - 从 SQL 插入查询中获取新记录主键 ID 以将相同的值插入另一个表?

c# - 生成进程时如何重定向标准输出

java - 是否可以将 Java 中的标准输出设置为文件和标准输出?

python - 如何在 Panda 中遍历 groupby 对象

python - 如何在 Django 中结合过滤和分页?

c# - 是否有任何事件告诉我进程正在等待输入?

C#事件继承

Python.NET - 将 Python 列表转换为 .NET 列表 (C#)

javascript - 为什么我的按钮点击会执行多次?

python - 如何在Python中调用字典中的函数