debugging 无法使VSCode/Python调试器找到我的项目模块

i7uaboj4  于 2023-03-08  发布在  Vscode
关注(0)|答案(7)|浏览(301)

我有一个项目,并试图调试我的main.py。我真的很困惑,为什么我得到以下错误的导入在我的文件(仅)顶部运行调试器:

Exception has occurred: ModuleNotFoundError
No module named 'bbb'
  File "/Users/maxepstein/myproject/bbb/train/__main__.py", line 8, in <module>
    from bbb.mysubfolder.myfile import myfunction

我的项目文件夹结构,如这些print语句所示(如调试器所示),确认了我的'bbb'模块存在,并且有一个__init__.py:

import os
print(os.getcwd())
print(os.listdir())
print(os.listdir('bbb'))

/Users/maxepstein/myproject
['requirements.txt', 'bbb', 'resources', '__init__.py', 'readme.md', 'results', '.gitignore', '.git', '.vscode', 'bbenv']
['config', 'tests', '__init__.py', 'utils', 'predict', 'train']

我试着调试为“调试当前文件-集成终端”,下面是我的debug settings.json中适用的调试设置。在网上搜索后,我真的认为添加下面的"cwd": "/Users/maxepstein/myproject"将是我的解决方案,但它没有帮助。

"version": "0.2.0",
"configurations": [
    {
        "name": "Python: Current File (Integrated Terminal)",
        "type": "python",
        "request": "launch",
        "program": "${file}",
        "console": "integratedTerminal",
        "cwd": "/Users/maxepstein/myproject"
    }
emeijp43

emeijp431#

@BrettCannon提到的错误的一个简单解决方案是将以下env条目添加到launch.json配置中:

{
    "version": "0.2.0",
    "configurations": [
        {
           "name": "Python: Current File",
           "type": "python",
           "request": "launch",
           "program": "${file}",
           "console": "integratedTerminal",
           "env": { "PYTHONPATH": "${workspaceRoot}"}
        }
    ]
}
2q5ifsrm

2q5ifsrm2#

从嵌套目录导入时出现相同的问题,通过将其附加到env变量PYTHONPATH中修复了该问题:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "cwd": "${workspaceFolder}",
            "env": {
                "PYTHONPATH":"${PYTHONPATH}:/home/maxepstein/myproject/"
            }
        }
    ]
}
avwztpqn

avwztpqn3#

当我在VS代码中调试Python模块时,我使用Module调试配置,而不是Current File调试配置。

{
    "name" : "Python: Module",
    "type" : "python",
    "request": "launch",
    "module": "bbb",
    "args": []
}

参见文档https://code.visualstudio.com/docs/python/debugging
此外,在VS代码中,这些步骤将为您自动填充这些设置:
调试-〉添加配置-〉Python:模块

voase2hg

voase2hg4#

在我的例子中,我选择了正确的解释器,很快就修复了它:

cgvd09ve

cgvd09ve5#

您可以使用当前文件调试配置。在导入模块的调试文件中,将您试图导入的模块的完整路径添加到系统路径中。

sys.path.append('/Users/my_repos/hw/assignment')
import src.network as network

这里的模块是src,位于assignment目录中。

fv2wmkja

fv2wmkja6#

我从VS代码运行调试器。我在VS代码中的结构:

myproject
+vscode
+---launch.json
|
+src
+---test/
+------MainTest.py
+---Main.py

拯救了我的launch.json:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "env": {"PYTHONPATH": "${workspaceRoot}:src"},
            "console": "integratedTerminal"
        }
    ]
}
pokxtpni

pokxtpni7#

根据其他答案,我必须将launch.json更改为以下内容,以便能够成功调试我在项目中编写的任意python模块(通过点击F5,将.py文件作为VSCode的活动文件开始调试),否则,当文件试图从不同的自定义模块导入时,我会遇到相同的"ModuleNotFoundError"
操作系统= Ubuntu 20.04(WSL 2)

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug-my-code",
            "type": "python",
            "python": "/home/<user>/<path/to/my/repo>/.venv/bin/python",
            "request": "launch",
            "program": "${relativeFileDirname}/${fileBasename}",
            "purpose": ["debug-test"],
            "console": "integratedTerminal",
            "justMyCode": true,
            "env": {"PYTHONPATH": "/home/<user>/<path/to/my/repo>"},
        }
    ]
}

附注

  • 我不得不把我的venvpython的完整绝对路径作为python路径--甚至用~代替/home/user/也被拒绝了
  • 类似地,我必须将repo的完整绝对路径放在PYTHONPATH环境变量中
  • 对于程序,我需要指定我正在调试的文件的相对路径,相对于repo根目录。

例如,如果我尝试调试的文件是<repo-root>/src/data/process.py,那么"${relativeFileDirname}"会得到src/data,而"${fileBasename}"会添加特定的模块process.py
希望这对某人有帮助。我试过很多其他的组合,但这是唯一一个最终起作用的。

相关问题