2014-10-05 14 views
7

Ich versuche pretty printing für STL in meiner GDB auf Ubuntu 14.04 hinzuzufügen. Einige Details zu den Werkzeugen:GDB pretty printing ImportError: Kein Modul namens 'printers'

OS: Ubuntu 14.04

GDB Version: 7.7

Python-Version: 2.7.6

python3 Version: 3.4.0

Aber nachdem ich Setup genau wie die Anweisung gesagt hat. Ich bekomme immer noch folgende Fehler:

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. 

Dann habe ich mein hübsches Druckinstallationsverzeichnis überprüft. Unter dem Verzeichnis /home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6/ kann ich deutlich sehen, dass ich die Datei printers.py habe. Und ich sehe auch den Inhalt von printers.py, ich bin sicher, dass es auch die register_libstdcxx_printers Klasse hat. Warum beschwert sich der Python-Interpreter immer noch das printers Modul fehlt? Das erscheint mir wirklich seltsam.

Antwort

10

Ich habe gerade etwas selbst ausprobiert, und zum Glück funktioniert es jetzt. Zumindest kann es den Karten- und Vektorinhalt wie erwartet ausdrucken. Hier ist, was ich getan habe:

Da es sich beschweren, dass es das Modul printer.py nicht finden kann, dann denke ich sollte wahrscheinlich ich Python-Interpreter sagen, wo diese Datei befindet. Also zuerst ich hinzugefügt, um diese zusätzliche Zeile meiner ~/.gdbinit: sys.path.append("/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6")

(Nach der Linie sys.path.insert(0, '/home/jerry/myLib/gdb_stl_support/python'))

Dann wieder gdb laufen, bekam ich folgende Fehlermeldung:

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. 

Angesichts der Fehlerinformationen, habe ich die ~/.gdbinit Datei bearbeitet und die Zeile register_libstdcxx_printers (None) kommentiert.

Und dann nach dem Ausführen von gdb, es funktioniert.

Aber ich frage mich immer noch, ob Verzeichnis in sys.path rekursiv durchsucht wird? Ich meine, in meinen Augen sollte der Python-Interpreter so funktionieren: Sobald Sie ein Verzeichnis zu sys.path hinzugefügt haben, wird das Unterverzeichnis unter diesem Verzeichnis auch nach einer Moduldatei durchsucht.

+1

Nein, es gibt keine "Suche" nach Moduldateien. Wenn ein Verzeichnis in sys.path andere Verzeichnisse enthält, müssen diese * Pakete * sein, damit Sie Module von innen importieren können. Dann müssen Sie den Paketnamen in der import-Anweisung angeben. Z.B. "import gdb" funktioniert, und "import gdb.printing" funktioniert, aber * nicht * "import printing". – deets

+0

@deets Vielen Dank für die Erwähnung der _ [packages] (https://docs.python.org/2/tutorial/modules.html#packages) _ Konzepte in Python. Ich weiß nicht, dass Python solche Submodule organisiert. – Dreamer

+2

Zusätzlich musste ich '' python/libstdcxx/v6/__ init __. Py'' editieren und ersetzen '' von Drucker importieren register_libstdcxx_printers'' mit '' .printers import register_libstdcxx_printers'' (Meine GDB enthält Python 3.4) –