在cython代码中加入print语句影响输出

Adding print statements to cython code affects output

我有一个应用程序是结合 Python 和 Cython 编写的。我最近为此应用程序添加了一项新功能和测试。测试在我的本地机器(一台 macbook)上通过了,但是当我推送到 appveyor(一个 Windows CI 服务)时,测试失败了。这本身并不奇怪。当我将打印语句添加到我的 Cython 代码以试图查看它在 appveyor 上运行时发生了什么时,测试不再失败。这令人沮丧,因为它让我无法弄清楚当 appveyor 上的测试失败时发生了什么。它也很令人困惑,因为它违反了我对 Python 和 Cython 通常如何工作的理解。

我的代码很复杂,我没有合理的方式来分享这种现象的例子。但是,我正在寻找可能发生这种情况的原因。 Cython 代码中的 print 语句如何以及在什么情况下对其他计算产生影响?

根据我的经验,典型情况是您设法从未分配或未对齐的存储中获取值——简而言之,内存使用错误会削弱编译器检测此类滥用的能力。通常,您会得到一个垃圾值; print 语句强制执行 "fixes" 问题的评估或内存对齐。

这在大多数现代语言中很难意外地做到,除非您专门 "hard-cast" 一个值,在不改变位值的情况下更改类型。

为了节省一些时间,您可以尝试使用阻塞 RDP (https://www.appveyor.com/docs/how-to/rdp-to-build-worker/) 进行更深入的调试,您可以将其插入 Appveyor 构建的不同阶段。请注意,RDP 会话中的环境变量与构建代理过程中的环境变量不同,因此您可能需要调整 RDP 环境以获取回购协议。

--伊利亚。