2016-08-29 51 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。

相關問題