2014-10-05 68 views
7

我試圖在我的GDB的Ubuntu 14.04上爲STL添加pretty printing。在工具的一些細節:GDB漂亮的打印ImportError:沒有名爲'printers'的模塊

操作系統:Ubuntu的14.04

gdb的版本:7.7

Python版本:2.7.6

python3版本:3.4.0之後

但我的設置完全如教學所說。我仍然得到以下錯誤:

Traceback (most recent call last): 
    File "<string>", line 3, in <module> 
    File "/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6/__init__.py", line 19, in <module> 
    from printers import register_libstdcxx_printers 
ImportError: No module named 'printers' 
/home/jerry/.gdbinit:6: Error in sourced command file: 
Error while executing Python code. 
Reading symbols from main...done. 

然後,我已經雙重檢查了我漂亮的打印安裝目錄。在目錄/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6/下,我可以清楚地看到我有printers.py文件。我還查看了printers.py的內容,我確定它也有register_libstdcxx_printers類。爲什麼python解釋器仍然抱怨缺少printers模塊?這對我來說似乎很奇怪。

回答

10

我只是自己嘗試了一些東西,幸運的是,現在它正在工作。至少它可以按照預期打印地圖和矢量內容。這是我做的:

因爲它抱怨說找不到printer.py模塊,所以我想我應該告訴python解釋器這個文件的位置。所以我首先加入這個額外的行了我的〜/ .gdbinit: sys.path.append("/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6")

然後重新運行GDB(行sys.path.insert(0, '/home/jerry/myLib/gdb_stl_support/python')後),我得到了以下錯誤:

Traceback (most recent call last): 
    File "<string>", line 5, in <module> 
    File "/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6/printers.py", line 1247, in register_libstdcxx_printers 
    gdb.printing.register_pretty_printer(obj, libstdcxx_printer) 
    File "/usr/share/gdb/python/gdb/printing.py", line 146, in register_pretty_printer 
    printer.name) 
RuntimeError: pretty-printer already registered: libstdc++-v6 
/home/jerry/.gdbinit:7: Error in sourced command file: 
Error while executing Python code. 

鑑於錯誤信息,我編輯了〜/ .gdbinit文件並註釋了行register_libstdcxx_printers (None)

然後在運行gdb之後,它可以工作。

但我仍然想知道sys.path中的目錄是否被遞歸搜索?我的意思是在我看來,python解釋器應該像這樣工作:一旦你添加了一個目錄到sys.path,那麼該目錄下的子目錄也將被搜索到一個模塊文件。

+1

不,沒有「搜索」模塊文件。如果sys.path中的某個目錄包含其他目錄,則這些目錄必須是* packages *,以便您能夠從內部導入模塊。但是,您需要在導入語句中提供軟件包名稱。例如。 「import gdb」起作用,「import gdb.printing」起作用,但是* not *「導入打印」。 – deets 2014-10-06 17:11:14

+0

@deets感謝您在Python中提及_ [packages](https://docs.python.org/2/tutorial/modules.html#packages)_概念。我不知道python是這樣組織子模塊的。 – Dreamer 2014-10-07 18:19:15

+2

我需要編輯''python/libstdcxx/v6/__ init __。py''並用''from .printers import register_libstdcxx_printers''替換''從打印機導入register_libstdcxx_printers''(我的GDB包括Python 3.4) – 2014-10-24 08:49:47

相關問題