VS代码中的Python:从子文件夹导入模块时发生错误

时间:2020-04-16 22:45:05

标签: python visual-studio-code import module subdirectory

我最近开始探索VS Code来开发Python代码,当我尝试从子文件夹中导入模块时遇到了一个问题。当我在Jupyter笔记本中执行该代码时,完全相同的代码可以完美运行(子文件夹包含__init__.py文件等。)我相信我已按照说明正确设置了VS Python扩展。除了此一个导入命令以外的所有其他命令都可以正常工作,但我无法弄清楚到底出了什么问题。

项目的结构如下:设置为cwd的根文件夹包含两个子文件夹(srcbld)。 src包含py文件,该文件导入使用foo.py

保存在bld文件夹中的from bld.foo import foo_function文件夹中的模块。

运行文件时,出现以下错误: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 个答案:

答案 0 :(得分:0)

我想我终于想出了答案:集成终端不扫描PYTHONPATH文件中的.env。但是,在集成窗口中运行文件时,PYTHONPATH正确地来自.env。因此,为了在终端中运行脚本,我必须在terminal.integrated.env.*中添加settings.json行,如下所示:

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

答案 1 :(得分:0)

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日开始)