【问题标题】:Python in VS Code: Error when importing module from subfolderVS Code 中的 Python:从子文件夹导入模块时出错
【发布时间】:2020-04-16 22:45:05
【问题描述】:

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

项目结构如下: 根文件夹,设置为cwd,包含两个子文件夹(srcbld)。 src 包含py-文件,该文件使用from bld.foo import foo_function 导入保存在foo.pybld-文件夹中的模块

运行文件时,我收到以下错误: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"
        }
    ]
}

任何想法或帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    Stefan 的方法对我有用。

    以文件系统为例: 工作区文件夹/文件夹/子文件夹1/子文件夹2/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 代码不会简单地选择要添加到 sys.path 的工作区文件夹。相反,它将 workspaceFolder/folder/subfolder1/subfolder2 添加到 sys.path 中,这对于包导入是无用的。请记住,运行试图导入模块的脚本的当前工作目录可能是工作区文件夹,并且 VS 代码仍然不会将该文件夹添加到 sys.path
    【解决方案2】:

    我想我终于自己想出了答案:集成终端不扫描.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}"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-24
      • 2012-02-15
      • 2013-08-26
      • 2013-01-18
      • 2021-10-23
      • 2018-06-01
      • 1970-01-01
      相关资源
      最近更新 更多