【问题标题】:Can I step into Python library code?我可以进入 Python 库代码吗?
【发布时间】:2014-11-29 16:28:48
【问题描述】:

当我运行 Python 调试器时,我可以单步执行我编写的函数。但是,如果我尝试进入像 os.mkdir("folder") 这样的库函数,例如,它会“跳过”它。有没有办法进入内置库函数来查看 Python 在后台做了什么?

理想情况下,有一种方法可以在 PyPy 中执行此操作,以便您可以继续深入研究 Python 代码。

【问题讨论】:

    标签: python debugging libraries system-calls pdb


    【解决方案1】:

    os.mkdir() 是用 C 代码实现的,pdb 无法进入该函数。

    您仅限于调试纯 Python 代码;该代码是否是标准库的一部分并不重要。例如,您可以进入shutil 模块,或者os.path 就好了。

    os.mkdir() 必须调用本机代码,因为它与操作系统交互;甚至 PyPy 也必须遵循底层(主机 Python)os.mkdir() 调用来处理该部分,因此即使在 PyPy 中,您也无法使用 pdb 进入它。事实上,就像在 CPython 中一样,标准库的那部分是 RPython 运行时的一部分,也不被 PyPy 视为“本机 Python 代码”,就像内置类型是运行时环境的一部分一样。

    你可以运行 PyPy 解释器 untranslated(所以不是静态编译 RPython 代码,而是让 Python 直接运行 PyPy 解释器),但这只会让你访问 RPython 代码路径,而不是os.mkdir() C 代码。

    【讨论】:

    • @twasbrillig:封装 OS 函数的函数仍然需要使用本机编译的代码,即使在 PyPy 中也是如此。
    • 谢谢。只是好奇,例如像 "string".index 这样的内置非操作系统函数呢?可以逐步使用 PyPy 吗?
    • @twasbrillig:实际上,您也不能进入 rpython 对象的代码部分;与 Python 内置类型一样,在 PyPy 中,内置类型是 RPython 的一部分,不能通过 PyPy 中的 pdb 调试器进入它们的代码。
    • 哦,好吧。再次感谢您的调查!
    【解决方案2】:

    pdb,Python 调试器,不能像 os.mkdir 这样单步执行 C 函数,但 gdb 可以。试试这个:

    gdb --args python whatever.py ...
    

    然后:

    start
    break posix_mkdir
    continue
    

    您应该会看到它在 Python 的 os.mkdir 实现中停止,详见此处:https://stackoverflow.com/a/16617835/4323

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      相关资源
      最近更新 更多