【问题标题】:Adding print statements to cython code affects output将打印语句添加到 cython 代码会影响输出
【发布时间】:2016-08-29 21:02:13
【问题描述】:

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

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

【问题讨论】:

    标签: python windows cython appveyor


    【解决方案1】:

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

    这在大多数现代语言中很难意外做到,除非您专门“硬转换”一个值,在不改变位值的情况下更改类型。

    【讨论】:

    • 问题原来是一个未初始化的整数,需要初始化为零。在 macbook 上它无论如何都是从零开始的,但我猜在 Windows 上它只是内存位置的随机值。我仍然不明白的是为什么打印其他变量的特定组合似乎可以解决问题。但是,我怀疑这与您所描述的情况接近。
    • 啊哈!我对您的代码允许未初始化的变量感到失望;我已经习惯了第一个参考得到运行时错误。是的,我希望添加的 print 恰好将一大把 0 位撞到您需要的位置。
    • 在普通 Python 中,当您尝试使用未初始化变量的值时,确实会遇到运行时错误。在 Cython 中,您可以像在 C 中一样声明一个变量,而无需对其进行初始化。所以我声明了一个 int 计数器,但忘记将其初始值设置为零。
    【解决方案2】:

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

    --伊利亚。

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 2011-04-11
      • 2013-08-09
      • 2023-04-09
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多