2014-10-05 42 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

相关问题