2014-10-05 8 views
7

Sto cercando di aggiungere pretty printing per STL nel mio GDB su Ubuntu 14.04. Alcuni dettagli sugli strumenti:GDB pretty printing ImportError: Nessun modulo denominato 'printers'

OS: Ubuntu 14.04

versione gdb: versione 7.7

pitone: 2.7.6

versione python3: 3.4.0

Ma dopo che l'installazione esattamente come dicevano le istruzioni. Ricevo ancora i seguenti errori:

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. 

Quindi ho controllato due volte la mia bella directory di installazione di stampa. Sotto la directory /home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6/, posso chiaramente vedere che ho il file printers.py. E vedo anche il contenuto di printers.py, sono sicuro che ha anche la classe register_libstdcxx_printers. Perché l'interprete Python sta ancora lamentando la mancanza del modulo printers? Questo mi sembra davvero strano.

risposta

10

Ho appena provato qualcosa da solo e, fortunatamente, ora funziona. Almeno può stampare la mappa e il contenuto vettoriale come previsto. Ecco cosa ho fatto:

Dal momento che si lamenta che non riesce a trovare il modulo printer.py, quindi penso che probabilmente dovrei dire all'interprete python dove si trova questo file. Così ho aggiunto questa linea aggiuntiva al mio ~/.gdbinit: sys.path.append("/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6")

(Dopo la linea sys.path.insert(0, '/home/jerry/myLib/gdb_stl_support/python'))

poi correre di nuovo gdb, ho ottenuto il seguente errore:

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. 

Dato il informazioni sull'errore, ho modificato il file ~/.gdbinit e ho commentato la riga register_libstdcxx_printers (None).

E dopo aver eseguito gdb, funziona.

Ma mi chiedo ancora se la directory in sys.path viene cercata in modo ricorsivo? Intendo nella mia mente, l'interprete python dovrebbe funzionare in questo modo: una volta aggiunta una directory a sys.path, la sottodirectory in quella directory verrà anche cercata per un file di modulo.

+1

No, non esiste una "ricerca" per i file modulo. Se una directory in sys.path contiene altre directory, questi devono essere * pacchetti * affinché tu possa importare i moduli dall'interno. Ma poi devi dare il nome del pacchetto nella dichiarazione di importazione. Per esempio. "import gdb" funziona, e "importa gdb.printing" funziona, ma * non * "importa la stampa". – deets

+0

@deets Grazie per aver menzionato i [_ pacchetti] (https://docs.python.org/2/tutorial/modules.html#packages) _ concetti in python. Non so pitone sta organizzando sottomoduli come questo. – Dreamer

+2

Inizialmente avevo bisogno di modificare '' python/libstdcxx/v6/__ init __. Py'' e sostituire '' dalle stampanti import register_libstdcxx_printers'' con '' da .printers import register_libstdcxx_printers'' (My GDB include Python 3.4) –