我正在尝试从C#创建一个python进程并从python脚本中获取打印。
这就是我在C#代码中所拥有的:
namespace ConsoleApp1
{
public class CreateProcess
{
public String PythonPath { get; set; }
public String FilePath { get; set; }
public String Arguments { get; set; }
public Process process;
public void run_cmd()
{
this.process = new Process();
ProcessStartInfo start = new ProcessStartInfo
{
FileName = this.PythonPath,
Arguments = string.Format("{0} {1}", this.FilePath, this.Arguments),
UseShellExecute = false,
RedirectStandardOutput = true,
};
this.process.StartInfo = start;
this.process.OutputDataReceived += p_OutputDataReceived;
this.process.Start();
this.process.BeginOutputReadLine();
//this.process.WaitForExit();
}
void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.Write(e.Data);
}
}
class Program
{
static void Main(string[] args)
{
CreateProcess test = new CreateProcess();
test.PythonPath = "mypathtopython.exe";
test.FilePath = "pythonfilename";
test.Arguments = "arg1 arg2 arg3";
test.run_cmd();
}
}
}
当我删除WaitForExit()方法时,我收到此错误:
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp1252'>
OSError: [Errno 22] Invalid argument
当我保留它时,它可以工作,但是当python进程停止运行时,输出会打印到我的控制台(这是预期的)。我希望它能够实时发生。任何想法,我做错了吗?
这可能是python中的问题而不是C#中的问题,但我不确定如何修复它。这是我的python测试脚本:
import time
import os
import sys
print("First example")
time.sleep(10)
print("Arguments given:",sys.argv)
我也尝试过使用sys.stdout.flush()但没有成功。
答案 0 :(得分:1)
问题在于缓冲IO, 在每次打印后的python中,你应该刷新缓冲区 sys.stdout.flush()