Python在VS Code中:从子文件夹导入模块时出错

4
我最近开始使用VS Code来开发Python代码,但是当我尝试从子文件夹导入模块时遇到了一个问题。当我在Jupyter笔记本中执行相同的代码时(子文件夹包含__init__.py文件等),它可以完美运行。我相信我正确地按照说明设置了VS Python扩展。除了这一个导入命令之外,其他所有内容都很好,但我一直无法找出具体是哪里出了问题。
项目的结构如下: 根文件夹被设置为cwd,其中包含两个子文件夹(srcbld)。src包含一个py文件,该文件通过from bld.foo import foo_function导入保存在bld/foo.py中的一个模块。
运行文件时,我会收到以下错误:ModuleNotFoundError: No module named 'bld'。我安装了几个Anaconda Python环境,并且每个环境都遇到了同样的问题。当将foo.py复制到src目录并使用from foo import foo_function时,一切正常。
我的launch.json文件如下:
{
    "version": "0.2.0",
    "configurations": [

        {
            "name": "Python: Current File (Integrated Terminal)",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "cwd": "${workspaceFolder}",
            "env": {"PYTHONPATH": "${workspaceFolder}:${workspaceFolder}/bld"},
            "console": "integratedTerminal"
        }
    ]
}

任何想法或帮助都将不胜感激!
2个回答

3

Stefan的方法对我有效。

以文件系统为例: workspaceFolder/folder/subfolder1/subfolder2/bar.py

我无法像这样导入子文件夹: from folder.subfolder1.subfolder2 import bar 它会显示: ModuleNotFoundError: No module named 'folder'

我将以下内容添加到.vscode/settings.json中:

"terminal.integrated.env.osx": {
        "PYTHONPATH": "${workspaceFolder}"
    }

我还在我的代码开头添加了以下内容:
import sys
#[... more imports ...]
sys.path.append(workspaceFolder)
# and then, the subfolder import:
from folder.subfolder1.subfolder2 import bar

现在,它可以正常工作了。

注意:我的所有文件夹和子文件夹都有一个名为__init__.py的空文件。我仍然需要按照上述步骤进行操作。 VSCode版本:1.52.0(来自2020年12月10日)


好的,这也解释了我的问题。现在我不明白的是为什么VS code不直接选择workspaceFolder并将其添加到sys.path中。相反,它将workspaceFolder / folder / subfolder1 / subfolder2添加到sys.path中,这对于包导入毫无用处。请记住,尝试导入模块的脚本所运行的当前工作目录可能是workspaceFolder,并且VS code仍然不会将该文件夹添加到sys.path中。 - J B

1
我想我终于自己找到了答案:集成终端不会从.env文件中扫描PYTHONPATH。当在集成窗口中运行文件时,PYTHONPATH将从.env正确获取。因此,为了在终端中运行我的脚本,我必须按照以下方式在settings.json中添加terminal.integrated.env.*行:
{
    "python.pythonPath": "/anaconda3/envs/py36/bin/python",
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": true,
    "python.linting.flake8Enabled": false,
    "python.envFile": "${workspaceFolder}/.env",
    "terminal.integrated.env.osx": {
        "PYTHONPATH": "${workspaceFolder}"
    }
}

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