Can't load source files when .pyc files have wrong filepaths inside.
还没有人认领这个 Issue。
评估
调研方向
未指定源文件、测试或入口点。首先使用提供的 localRoot 和 remoteRoot pathMappings 重现 shared-.pyc 情况,然后跟踪 debugpy 如何从 .pyc 文件解析源路径;完成的标准是源代码能够正确加载,或者该失败能够解释无效路径及回退行为。
由索引模型根据 Issue 内容生成。
描述
Summary
debugpy + VSCode Python Debugger extension is unable to properly load source files when .pyc files are shared across multiple machines, on which the python source is stored at different filepaths.
Extended Details
I run my Python code sometimes locally (on my Macbook) and sometimes inside a docker container (in which I have my source mounted). I run VSCode on my Macbook, and I would like to be able to use VSCode to attach to and debug python programs (with debugpy) running on either my Macbook, or on the container.
Locally, the root of my project is at /Users/username/myproject. On the container, the root of the project is in /root.
My __pycache__ directories and .pyc files are also mounted, so the same cache files are shared between my local machine and the docker container.
.pyc files contain the absolute path of the source file they were generated from.
It appears debugpy (or VSCode Python Debugger extension?) is attempting to use filepaths stored in .pyc files, to look up source files. The observable behavior is if the .pyc file corresponding to the file I was debugging has the wrong filepath stored inside it, vs the filepath of the source file on that machine, then loading source in the debugger usually fails.
Specifically, if the .pyc file is generated on my Docker container and contains the source filepath /root/file.py, then when debugging on my local machine I get the error message:
Could not load source '/root/file.py': Unable to retrieve source for /root/file.py.
If the .pyc file is generated on my local machine and contains the source filepath /Users/username/myproject/file.py, then when debugging my code on my Docker container, I get the error message:
Could not load source '/Users/username/myproject/file.py': Unable to retrieve source for /Users/username/myproject/file.py.
In either case, if I delete the .pyc file, then rerun the program (which recreates the .pyc file with the right filepath), then debugging and loading the proper source files works properly.
Note this behavior may be somewhat tricky to reproduce, I see it pretty consistently attempting to debug the test suite of my large project, but wasn't able to get it working with a toy example. Sometimes instead of showing the error message, it instead shows bytecode.
Environment data
- debugpy version: 1.6.7.post1
- OS and version:
- Macbook: macOS Sonoma 14.3 (Apple M2 Pro)
- Container: Ubuntu 22.04.3 LTS x86_64
- Python version (& distribution if applicable, e.g. Anaconda): 3.11.6 (Anaconda)
- Using VS Code or Visual Studio: VS Code (Python Debugger v2024.0.0)
Debug launch.json
"configurations": [
{
// Attach to any local process with debugpy listening on port 5678
"name": "Attach to Local Process",
"type": "python",
"request": "attach",
"connect": {
"host": "127.0.0.1",
"port": 5678
},
"justMyCode": true
},
{
// Attach to a Container with this port forwarded
"name": "Attach to Container",
"type": "python",
"request": "attach",
"connect": {
"host": "127.0.0.1",
"port": "5679"
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/root"
}
],
"justMyCode": true
},
Workarounds
- Use
python -BorPYTHONDONTWRITEBYTECODEto prevent writing .pyc files at all - Delete pycache files when you encounter this issue.
- (Haven't done this yet but should work) don't share pycache files across different machines. Instead of pycache files being stored alongside source, extract them and store them in a separate directory using PYTHONPYCACHEPREFIX. Either: each machine has a separate set of python cache files (and they aren't shared), or set up two separate directories (ok to have them in the Mount), one directory for use by local and one for use by the docker container.
- I don't think there is any way to solve this issue using
"pathMappings"config inlaunch.json.
Ask
debugpy & VSCode Python Debugger Extension should be resilient to .pyc files with incorrect filepaths. Perhaps one of these approaches would work?
- Don't use
.pycfiles to find source code - If source not found at the location specified by
.pycfile, fall back to the default behavior (when no.pycfile) - Or even just a better error message! Figuring out what was happening here was tricky!
- 主要语言
- Python
- 星标
- 2.5k
- 派生
- 208
- 平均合并
- 1 天 43 分钟
- 30 天内合并 PR
- 6
环境准备
在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。
- 没有 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
microsoft/debugpy 的其他 Issue
-
pydevd_comm.py start_client() does not set TCP_NODELAY on the connections it opens可能已有人在做 @nightcityblade 于 57 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 78/100
-
Document "rules"-option可能已有人在做 @nightcityblade 于 46 天前认领。 未关闭documentation
难度 2/5 1-3 小时 新手友好度 68/100
-
wx.EventLoop() deprecation warning可能已有人在做 @nightcityblade 于 44 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 78/100
-
debugpy.configure(python=) is not properly documented可能已有人在做 @nightcityblade 于 55 天前认领。 未关闭documentation
难度 2/5 1-3 小时 新手友好度 62/100
-
难度 5/5 一周以上 新手友好度 15/100
查看 microsoft/debugpy 的全部 Issue
相似的 Issue
-
难度 1/5 1-3 小时 新手友好度 87/100
adri0/scadustats#128 ·
维护者通常 1 天内回复
-
`TIMESTAMP`, `TIMESTAMP_NTZ`, `TINYINT` and the other `TypeDecorator`s don't declare `python_type`未关闭
难度 2/5 1-3 小时 新手友好度 78/100
-
RPBC未关闭awaiting policy acceptance precheck-passed
难度 1/5 1 小时以内 新手友好度 78/100
Bioconductor/BiocContributions#240 · 1 条评论 ·
-
bug
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
documentation good first issue launch
难度 2/5 1-3 小时 新手友好度 83/100
FlologixAI/etchwork#4 ·