如何调试内置 Python 命令、包或模块?

Lig*_*tCC 2 python debugging visual-studio-code vscode-debugger

我想调试 Python 安装附带的一些基本包和/或内置包,包括pipvenv.

愿望来自文件权限的错误消息(无法访问具有“不可打印文件名”的文件),我的一些团队正在运行这些命令 -有关详细信息,请参阅此问题

如何在主蟒蛇可执行试图抓住问题,或者当直接运行的基础Python模块调试Python的源代码(见下面的例子为pipvenv)?

$ python -m pip install --upgrade
$ python -m venv .venv
Run Code Online (Sandbox Code Playgroud)

如果重要的话,我的环境是 VSCode,我很高兴能够在我编写的任何自定义脚本上使用调试器,使用与主要 Microsoft Python 扩展交互(我假设)的内置调试器。

Bre*_*non 8

您需要"justMyCode": falselaunch.json调试器中进行设置才能跟踪第三方代码。


Mar*_*ers 5

首先查看这些模块的源代码;所述-m开关查找一个封装或模块到第一进口。如果它是一个包,那么 Python 会导入该__main__包中的模块并将其作为主脚本运行。如果是模块,则模块本身被导入并作为__main__.

通常代码的结构是调用函数,您也可以直接导入。然后,您可以编写一些代码来导入相同的函数并以与__main__模块相同的方式调用它。从那时起,在调试器下运行它是微不足道的。

例如,pip是一个包,因此python -m pippip.__main__其作为脚本导入并运行。然后触发:

from pip._internal.cli.main import main as _main  # isort:skip # noqa

if __name__ == '__main__':
    sys.exit(_main())
Run Code Online (Sandbox Code Playgroud)

运行。你可以在 VSCode 中做同样的事情;导入pip._internal.cli.main.main并调用它。

您可以通过导入这些模块并打印出结果对象来找到这些模块的源代码:

from pip._internal.cli.main import main as _main  # isort:skip # noqa

if __name__ == '__main__':
    sys.exit(_main())
Run Code Online (Sandbox Code Playgroud)

模块的表示,如果从磁盘加载,将包括它的文件名。如果文件名以/__init__.py它的包结尾,那么您还可以仔细检查该__main__.py文件是否存在:

python -c "import pip; print(pip)"
Run Code Online (Sandbox Code Playgroud)

您可以对venv模块执行相同操作。这是 Python 标准库的一部分,因此文档实际上直接链接到源代码venv.__main__模块只是导入venv.main()并调用它。