GDB美化打印 ImportError:找不到“printers”模块

7
我正在尝试在Ubuntu 14.04上为我的GDB添加STL的漂亮打印。一些工具的详细信息如下:
操作系统: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模块?这对我来说似乎非常奇怪。

1个回答

11

我刚刚自己尝试了一下,幸运的是现在它可以工作了。至少它可以像预期的那样打印出地图和向量内容。这是我做的:

由于它抱怨找不到printer.py模块,我想我应该告诉Python解释器这个文件位于哪里。所以我首先在我的~/.gdbinit中添加了这行额外的代码: sys.path.append("/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6")

(在sys.path.insert(0, '/home/jerry/myLib/gdb_stl_support/python')这行代码之后)

然后再次运行gdb,我得到了以下错误:

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中的目录包含其他目录,则这些目录必须是,才能从内部导入模块。但是,您需要在导入语句中提供包名称。例如,“import gdb”起作用,“import gdb.printing”也起作用,但不起作用“import printing”。 - deets
@deets 感谢您提到 Python 中的 packages 概念。我不知道 Python 是这样组织子模块的。 - Dreamer
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Benji Mizrahi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接