2013-12-13 97 views
6

我已經下載熊貓源,現在試圖調試它。 我修改Makefile文件:如何在Pandas中調試Cython代碼?

sparse: pandas/src/sparse.pyx 
python-dbg setup.py build_ext --inplace --pyrex-gdb 

build: clean_pyc 
python-dbg setup.py build_ext --inplace --pyrex-gdb 

develop: build 
-python-dbg setup.py develop --pyrex-gdb 

另外我有一個非常簡單的腳本:

from numpy import asarray 
from pandas import algos 

v = [4171.0, 0.0] 
expAverage = algos.ewma(asarray(v), 50, 1) 

print expAverage 

當我嘗試使用python-DBG test1.py運行它,這就是我得到:

/tmp/1/pandas/pandas/hashtable.so: undefined symbol: Py_InitModule4_64 
Traceback (most recent call last): 
    File "test1.py", line 2, in <module> 
    from pandas import algos 
    File "/tmp/1/pandas/pandas/__init__.py", line 6, in <module> 
    from . import hashtable, tslib, lib 
ImportError: /tmp/1/pandas/pandas/hashtable.so: undefined symbol: Py_InitModule4_64 
[94423 refs] 

有什麼不對?

+2

其實我覺得它只是爲方便調試cythong時,只是把打印語句(老同學),但相當快。 – Jeff

+0

嗨@Jeff,我發現你的評論非常有趣。我既不是熊貓也不是Cython/Python用戶,但我已經在SAS中編程。我的教授從來沒有教過我們使用調試器,我們總是被告知在編譯時只是使用print語句來檢查我們的程序。所以,一般來說,即使我們在其他編程語言中使用它們,您也認爲將打印語句與調試器一樣有效?看起來Pandas擁有比R. Cheers更爲一致的語法。一般調試器中的 –

+0

都不錯(例如pdb)。我只是指出,對於一個相對簡單的函數和一個快速的編譯運行循環來說,打印語句通常就足夠了 – Jeff

回答

1
  1. 很顯然,至少有一個正在加載的(C)擴展沒有以python-dbg可以使用的方式用調試信息進行編譯。

這一解釋的細節:

http://hustoknow.blogspot.co.uk/2013/06/why-your-python-program-cant-start-when.html

對我來說,好像--with-pydebug標誌並不等同/觸發相同的操作--pyrex-gdb。順便說一句,看來--pyrex-gdb已被重命名爲--cython-gdb

  1. 您可以用cygdbcython --gdb代替嗎?好像你正在使用已報告不工作的標誌:https://groups.google.com/forum/#!topic/cython-users/K6sjhzUX5JA
+0

感謝您的回答。但是我很久以前就無法檢查它(實際上Python代碼只是一個原型,而我用Java重寫了所有內容)。 – relgames