升级至IronPython 3后输出重定向功能失效问题排查
IronPython 3 升级后输出重定向失效的解决方案
IronPython 3 对标准输出的底层调用逻辑和IronPython 2存在差异,你的自定义UnityLogWriter只重写了Write(string)方法,但IronPython 3 现在主要通过Write(char[], int, int)这类字符数组重载来输出内容,导致你的日志捕获逻辑无法触发。
修改后的UnityLogWriter实现
将输出处理逻辑提取为公共方法,并重写所有可能被调用的Write重载,确保覆盖IronPython 3的输出场景:
public class UnityLogWriter : StreamWriter { private readonly Action<string> _logger; private string _buffer = ""; public UnityLogWriter(Action<string> logger, Stream stream) : base(stream) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } // 统一处理输出内容的逻辑 private void ProcessOutput(string value) { _buffer += value; var lines = _buffer.Split('\n'); for (int i = 0; i < lines.Length; i++) { if (i == lines.Length - 1) { _buffer = lines[i]; } else { // 移除Windows风格的\r换行符,避免Unity日志出现多余空行 _logger(lines[i].TrimEnd('\r')); } } } // 兼容IronPython 2的string输出调用 public override void Write(string value) { base.Write(value); ProcessOutput(value); } // 适配IronPython 3的核心输出调用 public override void Write(char[] buffer, int index, int count) { string value = new string(buffer, index, count); base.Write(buffer, index, count); ProcessOutput(value); } // 覆盖单个字符的输出场景 public override void Write(char value) { base.Write(value); ProcessOutput(value.ToString()); } }
输出重定向代码保持不变
你的原有重定向逻辑无需修改,直接使用即可:
var infoStream = new MemoryStream(); var infoWriter = new UnityLogWriter(Debug.Log, infoStream); engine.Runtime.IO.SetOutput(infoStream, infoWriter);
额外提示
如果仍有输出延迟问题,可以在Python代码执行完成后调用infoWriter.Flush(),确保缓冲区剩余的内容被处理。
内容的提问来源于stack exchange,提问作者Riley B
相关产品推荐
相关产品推荐

