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

43

我有一个项目,正在尝试调试我的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

通过这些打印语句(如调试器所示),我的项目文件夹结构证实了我的“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"
    }
8个回答

57

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

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

2
"env": { "PYTHONPATH": "${workspaceRoot}"} 是一个很好的解决方法! - R.Liu
很遗憾我不得不这样做,但还是谢谢你分享它。 - rsmith54
2
我正在使用虚拟环境(.venv文件夹),并在调试器中遇到了“ModuleNotFound”错误。这个方法解决了它。 - abk
1
如何找到launch.json:在右侧面板中,找到“运行和调试”。在顶部,您会找到一个下拉菜单。可能会写着“Python: Current File”。按下并单击“添加配置”。它将打开launch.json。然后按照答案操作。 - Melih Dal
2
我同意@AlexSham的观点,这个问题让我在Stack Overflow上花了3个多小时,包括像很多人建议的那样,在那个位置放入我的实际Python路径。只有上面这个确切的语法才解决了这个问题。__对于其他遇到这个问题的人__:即使这个解决方案看起来不太可能奏效,你也应该至少尝试一下。 - Mote Zart
显示剩余3条评论

18
在我的情况下,我很快选择了正确的翻译工具来解决这个问题: (根据版本不同,翻译工具显示在左下角或右下角。) (根据版本不同,翻译工具显示在左下角或右下角。)

interpreter selection


4
太棒了!救了我的一天。谢谢。 - joaocarlospf
1
太棒了,救了我的一天,谢谢。 - Dika Arta Karunia
1
我也试过了(在Mac上)!手动打开命令面板(cmd+shift+p)。使用 pipenv --venv 命令查找位置。 - nugenjs
我认为这是最佳答案,但是界面已经改变,现在选择翻译语言的功能在右上角。 - undefined

14

从嵌套目录导入时遇到了同样的问题,通过将环境变量PYTHONPATH附加到其值来解决了该问题:

当从嵌套目录导入时遇到相同问题,可以通过将环境变量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/"
            }
        }
    ]
}

10

当我在VS Code中调试Python模块时,我使用的是“模块调试配置”,而不是“当前文件”的配置。对于您来说,可能是这样的:

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

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

嘿,感谢您的回答。我实际上正在尝试调试我的 bbb.train 模块(我之前所在的文件是 bbb/train/__main__.py),但在以 Python: Module 模式运行调试器时仍然出现 No module named bbb.train 的错误。有任何想法吗?当我在相同路径下的外部 shell 中运行 python -m bbb.train 时,它可以正常运行,这让我感到困惑... - Max Power
3
这是一个已知的 bug,在处理子包时无法正常工作。 - Brett Cannon
嗨,Brett,我两天前通过将Python路径显式添加到当前文件夹中来运行调试器,正如您在GitHub问题中建议的那样。昨天我只是想再次确认它是否有效,但现在我遇到了VSCode调试器的新问题:https://github.com/DonJayamanne/pythonVSCode/issues/1441 - Max Power
FYI,那是错误的代码库:你想要的是github.com/microsoft/vscode-python。 - Brett Cannon
我点赞了,因为我认为这是最接近我的问题的,但现在我得到了“没有名为blah.__main__的模块;'blah'是一个包,不能直接执行”的错误。从CLI中,执行'blah'可以工作,因为它已经通过包安装,即通过pyproject.toml使用python -m pip install blah。更糟糕的是,我必须以sudo身份执行'blah',所以现在我放弃了调试它的能力。 - J. Gwinner

4
你可以使用当前文件的调试配置。在你正在调试并引入模块的文件中,将要导入的模块的完整路径添加到系统路径中。
sys.path.append('/Users/my_repos/hw/assignment')
import src.network as network

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

我的项目文件夹路径 - 如果我正在测试子文件夹中的py文件...在导入任何模块之前,使用import sys并添加sys.path.append('项目路径'),然后所有模块都可以正常导入。谢谢Gary。 - Abdeali Chandanwala

2

我在VS Code中运行调试器。 我的VS Code结构:

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"
        }
    ]
}

1
也许您还没有更改调试器的解释器。 点击解释器并选择正确的解释器:

Click the interpreter and choose the right one


这与上面 @pmlks 的回答完全相同,只是附上了最新的截图。 - undefined

1
根据其他答案的提示,我必须更改我的launch.json文件才能成功调试在我的项目中编写的任意Python模块(通过按下F5以使用我的.py文件作为VSCode的活动文件开始调试)。否则,当文件尝试从不同的自定义模块进行导入时,我会遇到相同的"ModuleNotFoundError"错误。
操作系统 = Ubuntu 20.04(WSL2)
{
    "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>"},
        }
    ]
}

笔记

  • 我不得不使用我的 venv python 的完整绝对路径作为 python 路径 - 即使使用 ~ 代替 /home/user/ 也被拒绝了
  • 同样,我必须在 PYTHONPATH 环境变量中放置我的存储库的完整绝对路径
  • 对于我需要调试的文件,我需要指定相对于存储库根目录的文件的相对路径。

例如,如果我尝试调试的文件是 <repo-root>/src/data/process.py,那么"${relativeFileDirname}" 将让我得到 src/data,而 "${fileBasename}" 添加了特定的模块 process.py

希望这能帮助某些人。 我尝试了许多其他组合,但这是唯一最终起作用的。


设置env对我来说有效,但这似乎是Python扩展的一个错误,因为它似乎忽略了"python";我观察到的一个可能相关的情况是,只有在运行带有__main__.py的模块的任务时才会发生这种情况,而运行带有"module": "uvicorn"指向__init__.py的fastapi服务器时,会按预期使用"python" - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接