2016-08-29 98 views
1

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

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

回答

2

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

这是很难在最现代的语言不小心做,除非你特别“硬投”的值,改变类型,而不改变位值。

+0

问题被证明是一个未初始化的整数,它需要被初始化为零。无论如何,在macbook上它始于零,但我猜想在Windows上它只是随机值在内存位置。我仍然不明白的是,为什么打印一个特定的其他变量组合似乎解决了这个问题。不过,我怀疑这与你所描述的内容很接近。 – jcrudy

+0

啊哈!我很失望你的代码允许未初始化的变量;我非常习惯于获得运行时错误的第一个参考。是的,我期望添加的** print **恰好碰巧碰到了一个0位的位置,为您所需。 – Prune

+0

在正常的Python中,当您尝试使用未初始化变量的值时,确实会出现运行时错误。在Cython中,你可以声明一个类似于C的变量而不用初始化它。所以我宣布了一个int计数器,但忘记将其初始值设置为零。 – jcrudy

1

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

--ilya。

相关问题