我想调试一些Python安装和/或内置软件包的基本软件包,包括pip
和venv
。
愿望来自文件权限的错误消息(无法访问具有"不可打印文件名"的文件(,我的一些团队正在运行这些命令 - 有关详细信息,请参阅此问题。
问题
当尝试捕获主 python 可执行文件中的问题时,或者直接运行基本 python 模块时,如何调试 Python 源代码(请参阅以下示例以获取pip
和venv
(?
$ python -m pip install --upgrade
$ python -m venv .venv
如果这很重要,我的环境是VSCode,在那里我很乐意使用与主要Microsoft Python扩展交互(我假设(的内置调试器在我编写的任何自定义脚本上使用调试器。
您需要在launch.json
中设置"justMyCode": false
,以便调试器跟踪到第三方代码中。
首先查看这些模块的源代码;-m
开关首先查找要导入的包或模块。如果它是一个包,则 Python 会将__main__
模块导入该包中,并将其作为主脚本运行。如果是模块,则导入模块本身并按__main__
运行。
通常代码的结构使得调用函数也可以直接导入。然后,您可以编写一些代码来导入相同的函数,并以与__main__
模块相同的方式调用它。从那里开始,在调试器下运行它是微不足道的。
例如pip
是一个包,因此python -m pip
将导入pip.__main__
并将其作为脚本运行。然后触发:
from pip._internal.cli.main import main as _main # isort:skip # noqa
if __name__ == '__main__':
sys.exit(_main())
要运行。您可以在 VSCode 中执行相同的操作;导入pip._internal.cli.main.main
并调用它。
您可以通过导入这些模块并打印出结果对象来找到这些模块的源代码:
python -c "import pip; print(pip)"
如果从磁盘加载模块,则表示形式将包括其文件名。如果文件名以/__init__.py
结尾,则它是一个包,因此您还可以仔细检查__main__.py
文件是否存在:
python -c "import pip.__main_; print(pip.__main__)"
您可以对venv
模块执行相同的操作。这个是 Python 标准库的一部分,所以文档实际上直接链接到源代码,venv.__main__
模块只是导入venv.main()
并调用它。