进程对象 运行 Python 脚本未成功重定向输出

Process object running Python script doesn't redirect output successfully

我正在 运行通过进程 class 通过我的 c# 程序编写一个简单的 python 脚本。这是我用来实际 运行 脚本的代码:

    public PythonScript (string filePathDir, string args, Action<string> write)
    {
        this.filePathDir = filePathDir;
        this.args = args;
        this.write = write;

        script_thread = new Thread (Run);
        script_thread.Start ();
    }

    private void Run()
    {
        process = new ProcessStartInfo ();
        process.Arguments = args;
        process.FileName = filePathDir;
        process.UseShellExecute = false;
        process.RedirectStandardOutput = true;

        p = Process.Start (process); // p is declared as "Process p;"
        while (true) {
            write ("running");
            string foo = p.StandardOutput.ReadLine ();
            write ("running1");
            write (foo);
        }
    }

我实际创建 PythonScript 对象的方式是:

PythonScript py = new PythonScript("python3", "HeartAPI.py", Write)

Write 是我的输出方法(用于打印信息)。此格式来自 here。 (注意:我正在调用 python3 而不是 python.exe 或其他东西,因为我在 KUbuntu 环境中 运行ning)

我 运行 遇到的问题是,当我 运行 我的脚本(这是一个基本的 api)时,api 是可访问和可用的,但每次我的 python 脚本调用 print() 时,我的 Write 函数不会输出任何内容。但是,我知道这不是我传递方法的方式,因为调用 write("running"); 确实有效,并且显示出来了。

有人知道为什么我的 python 输出流没有进入我的 write 方法吗?我无法在网上找到关于此问题的任何其他示例,因此将不胜感激!

编辑:澄清一下。我的 python 脚本执行 运行,并成功完成其操作。但是,据我所知,上述脚本的输出没有得到适当的重定向。传递到 PythonScript 对象的 Write(string) 方法确实工作正常,因为命令 write("running"); 完美执行并按应有的方式显示。为什么 Python 脚本的输出没有被重定向到我的 write() 方法?

编辑 2:为了回应我尝试过的答案,我在 PythonScript 构造函数的其余代码下添加了一个 script_thread.Join() 调用。这是更新后的代码:

    public PythonScript (string filePathDir, string args, Action<string> write)
    {
        this.filePathDir = filePathDir;
        this.args = args;
        this.write = write;

        script_thread = new Thread (Run);
        script_thread.Start ();
        script_thread.Join ();
        Console.WriteLine ("JOINED");
    }

我还添加了一个输出到控制台的调用,用于指示线程何时加入,但永远不会输出。尝试此代码时,我的 GUI window 从未出现。但是,我有一个已写入的日志系统,这是应该转到我的 GUI 控制台的输出:

 running
11:11:44-  Closing down Heart...
11:11:44-  Goodbye.
11:11:44-  running1
11:11:44-  
11:11:44-  running
11:11:44-  running1
11:11:44-  
11:11:44-  running
11:11:44-  running1
11:11:44-  
11:11:44-  running
11:11:44-  running1
11:11:44-  
11:11:44-  running
11:11:44-  running1
11:11:44-  
11:11:44-  running
11:11:44-  running1
11:11:44-  
11:11:44-  running
11:11:44-  running1

Closing Down Heart... 在 gui 被告知关闭时调用。所以我不太确定这里发生了什么,但这就是添加 Join() 调用后的输出。

我没有看到 script_thread.Join() 调用。我怀疑 C# 进程在 python 进程打印其第一行之前完成。

试试这个:

public PythonScript (string filePathDir, string args, Action<string> write)
{
    this.filePathDir = filePathDir;
    this.args = args;
    this.write = write;

    script_thread = new Thread (Run);
    script_thread.Start ();
    script_thread.Join ();  // Wait for the thread to terminate.
}

您能否在 python 脚本中打印某些内容后添加 sys.stdout.flush() 或打印一些额外的新行。您没有得到任何输出的原因可能是 python3.

的标准输出缓冲区