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

如何调试内置Python命令、包或模块?,python,debugging,visual-studio-code,vscode-debugger,Python,Debugging,Visual Studio Code,Vscode Debugger,我想调试Python安装附带的一些基本包和/或内置包,包括pip和venv 这个愿望来自文件权限的错误消息(无法访问具有“不可打印文件名”的文件),我的一些团队正在运行这些命令-有关详细信息,请参阅 问题: 在试图捕获Python主可执行文件中的问题时,或者在直接运行基本Python模块时(请参见以下示例了解pip和venv),如何调试Python源代码 $python-mpip安装--升级 $python-m venv.venv 如果重要的话,我的环境是VSCode,在这里我很高兴能够在我编

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

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

问题: 在试图捕获Python主可执行文件中的问题时,或者在直接运行基本Python模块时(请参见以下示例了解
pip
venv
),如何调试Python源代码

$python-mpip安装--升级
$python-m venv.venv

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

从查看这些模块的源代码开始;
-m
开关首先查找要导入的包或模块。如果它是一个包,那么Python将导入该包中的
\uuuu main\uuuu
模块,并将其作为主脚本运行。如果它是一个模块,模块本身将导入并作为
\uuuuu main\uuuuu
运行

通常,代码的结构是调用函数,您也可以直接导入。然后,您只需编写一段代码,导入相同的函数,并以与
\uuuu main\uuu
模块相同的方式调用它。从那时起,在调试器下运行它是很简单的

例如,
pip
是一个包,因此
python-mpip
将作为脚本导入并运行它。然后触发:

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

if __name__ == '__main__':
    sys.exit(_main())
待运行。您可以在VSCode中执行同样的操作;导入
pip.\u internal.cli.main.main
并调用它

您只需导入这些模块并打印出结果对象,即可找到这些模块的源代码:

python-c“导入pip;打印(pip)”
如果从磁盘加载,模块的表示形式将包括其文件名。如果文件名以
/\uuuuu init\uuuuuuuuuuuuuupy
结尾,则它是一个包,因此您还可以再次检查
\uuuuuuuuuuuuuuuuuuuuuu main.py
文件是否存在:

python-c“导入pip.\uuuu main;打印(pip.\uuuu main)”

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

您需要在
launch.json
中设置调试器,以便跟踪到第三方代码。

pip
是一个预构建的二进制文件,因此,如果您想调试它,最有可能涉及到直接修改它并重建可执行文件。对于
venv
,源文件似乎位于
\lib\venv
下的
\uu init\uuuuuuuuuuuuy.py
文件中。在那里,您可以添加
importpdb;pdb.set_trace()
来启动Python调试器(或者只需
breakpoint()
,它应该在VSCode中工作)。@b_c:
pip
“可执行文件”只是一个Python脚本,它使用来(间接)导入
pip.\u internal.cli.main
模块并在其中运行
main()
函数。打开pip指向的
路径,您将看到它只是可以添加调试语句的文本。@MartijnPieters很高兴知道!当我看时,我没有看到PIP模块(没想到它在<代码>站点包),我没有考虑<代码> Python -M PIP < /代码>,这表明它确实存在于某个模块中。谢谢!因此,查找并下载源代码——我是否还需要Python主安装中的“调试二进制文件”?我记得在最初的Python安装过程中(至少在Windows上)的复选框。@LightCC:
Python-c“import-pip;print(pip)”
将为您提供硬盘上源代码的路径。@LightCC:您不需要Python调试版本,不需要。这里没有任何东西是二进制扩展,都只是Python代码。