进程对象 运行 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.
的标准输出缓冲区
我正在 运行通过进程 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.
的标准输出缓冲区