2014-10-05 25 views
7

Próbuję dodać pretty printing dla STL w moim GDB na Ubuntu 14.04. Niektóre szczegóły dotyczące narzędzi:GDB pretty printing ImportError: Brak modułu o nazwie 'printers'

OS: Ubuntu 14.04

wersja gdb: wersja 7.7

python: 2.7.6

wersja python3: 3.4.0

ale po instalacji dokładnie tak, jak mówi instrukcja. Nadal dostaję następujące błędy:

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. 

Potem dwukrotnie sprawdziłem mój ładny katalog instalacji drukowania. W katalogu /home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6/ widzę wyraźnie, że mam plik printers.py. Widzę też zawartość printers.py, jestem pewien, że ma również klasę register_libstdcxx_printers. Dlaczego interpreter python wciąż narzeka na brak modułu printers? Wydaje mi się to naprawdę dziwne.

Odpowiedz

10

Po prostu spróbowałem czegoś sam i na szczęście, teraz działa. Przynajmniej może wydrukować mapę i zawartość wektorową zgodnie z oczekiwaniami. Oto co zrobiłem:

Ponieważ narzeka, że ​​nie może znaleźć modułu printer.py, to prawdopodobnie powinienem powiedzieć interpreterowi pythona, gdzie znajduje się ten plik. Więc najpierw dodano tę dodatkową linię do mojego ~/.gdbinit: sys.path.append("/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6")

(Po linii sys.path.insert(0, '/home/jerry/myLib/gdb_stl_support/python'))

następnie uruchomić gdb ponownie, mam następujący błąd:

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. 

Biorąc pod uwagę informacje o błędach, edytowałem plik ~/.gdbinit i skomentowałem wiersz register_libstdcxx_printers (None).

A potem po uruchomieniu gdb działa.

Ale nadal zastanawiam się, czy katalog w sys.path jest wyszukiwany rekurencyjnie? Mam na myśli, że interpreter pytonów powinien działać w ten sposób: po dodaniu jednego katalogu do sys.path, wówczas podkatalog pod tym katalogiem zostanie również przeszukiwany pod kątem pliku modułu.

+1

Nie, nie ma "wyszukiwania" plików modułów. Jeśli katalog w sys.path zawiera inne katalogi, muszą to być * paczki *, abyś mógł importować moduły od wewnątrz. Ale musisz podać nazwę pakietu w deklaracji importu. Na przykład. "importuj gdb" działa, a "importuj gdb.printing" działa, ale * nie * "importuj drukowanie". – deets

+0

@deets Dziękujemy za wzmiankę o _ [pakiety] (https://docs.python.org/2/tutorial/modules.html#packages) _ koncepcjach w pythonie. Nie wiem, Python organizuje takie submoduły. – Dreamer

+2

Edycja potrzebna do edycji '' python/libstdcxx/v6/__ init __. Py'' i zamiany '' from printers import register_libstdcxx_printers'' na '' from .printers import register_libstdcxx_printers'' (My GDB zawiera Python 3.4) –