使用C#调用Python程序,并实时获得Python程序的print内容
解决方案
在print后调用一下sys.stdout.flush()即可实时读到命令行的内容
print(os.path.join(self.imagefile, filename + ".jpg"))
sys.stdout.flush() # 清空缓冲区,实时输出
C# 调用python并接收命令行方法
/// <summary>
/// 执行命令行工具
/// </summary>
public static bool Execute(string processPath, string arguments, string workingDirectory, Action<string> outputCallBack = null, Encoding encoding = null, bool showWindow = false, double? timeout = null)
{
try
{
var processStartInfo = new ProcessStartInfo()
{
FileName = processPath,
Arguments = arguments,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
WorkingDirectory = workingDirectory,
StandardOutputEncoding = encoding == null ? Encoding.UTF8 : encoding,
#if DEBUG
WindowStyle = ProcessWindowStyle.Minimized,
CreateNoWindow = false
#else
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true
#endif
};
if (showWindow)
{
processStartInfo.WindowStyle = ProcessWindowStyle.Minimized;
processStartInfo.CreateNoWindow = false;
}
using (var progress = Process.Start(processStartInfo))
{
if (null == progress)
return false;
if (timeout != null)
{
var dateTime = DateTime.Now;
DateTime finshTime = dateTime.AddSeconds((double)timeout);
Task.Factory.StartNew(() =>
{
while (true)
{
if (finshTime < DateTime.Now || progress == null)
{
progress.Kill();
progress?.Close();
break;
}
Thread.Sleep(1000);
}
});
}
progress.OutputDataReceived += (sender, arg) =>
{
try
{
if (!string.IsNullOrEmpty(arg.Data) && null != outputCallBack)
outputCallBack(arg.Data);
}
catch (Exception ex)
{
}
};
progress.ErrorDataReceived += (sender, arg) =>
{
try
{
if (!string.IsNullOrEmpty(arg.Data) && null != outputCallBack)
outputCallBack(arg.Data);
}
catch (Exception ex)
{
}
};
progress.BeginErrorReadLine();
progress.BeginOutputReadLine();
progress.WaitForExit();
progress.Close();
}
return true;
}
catch (Exception ex)
{
return false;
}
}