我正在尝试调试目录结构中的模块,如下所示
cwd
├── project_directory
| | __init__.py
| ├──dir1
| ├── __init__.py
| ├── module1.py
| ├──dir2
| ├── __init__.py
| ├── module2.py
如果我从命令行运行:
python -m project_directory.dir1.module1
launch.json
文件以便调试模块。
{
"version": "0.2.0",
"configurations": [
{
"name": "Python Module",
"type": "python",
"request": "launch",
"console": "integratedTerminal",
"module": "project_directory.dir1.${fileBasenameNoExtension}",
}
]
}
使用上述启动文件进行调试会导致以下错误:
Error while finding module specification for 'dir1.module1' (ModuleNotFoundError: No module named 'dir1')
令我困惑的是,如果我将 cwd 更改为
project_directory
并编辑 launch.json
文件,使得
"module": "dir1.${fileBasenameNoExtension}"
调试器开始工作。不幸的是,这不是一个可行的解决方案,因为我有相对导入,并且 python 要求我位于
project_directory
的父目录中。
关于如何让调试器工作有什么想法吗?
相对导入的最佳实践是什么,以使它们造成的问题最少?
在 launch.json 中添加 "env":{ "PYTHONPATH": "${workspaceRoot}"} ,以模仿 -m 标志的行为。我用它来解决运行需要依赖的嵌套模块时的导入问题。
答案参考来自 Can't get VSCode/Python debugger to find my Project Modules
{
"version": "0.2.0",
"configurations": [
{
"name": "Python Module",
"type": "python",
"request": "launch",
"program": "${file}",
"env": { "PYTHONPATH": "${workspaceRoot}"}
}
]
}