繁体   English   中英

VSCode ModuleNotFoundError:没有名为 X 的模块

[英]VSCode ModuleNotFoundError: No module named X

我正在尝试构建一个新的 package,但是,当我尝试从 VSCode 内部或终端运行任何文件时,我遇到了这个错误:

ModuleNotFoundError: No module name 'x'

我当前的文件夹结构如下:

package
|---module
|------__init__.py
|------calculations.py
|------miscfuncs.py
|---tests
|------__init__.py
|------test_calcs.py
|---setup.py
|---requirements.txt

但是,当我通过 VSCode 运行我的测试(PyTest)并使用import module.calculations as calcfrom module.calculations import Class in test_calcs.py 时,测试按预期工作 - 这让我感到困惑。

我知道这是一个常见问题,但我无法想出一个可以在这里工作的解决方案。

我尝试使用下面的代码检查工作目录是否在系统路径中。 返回的目录列表中的第一项是我正在使用的目录。

import sys
print(sys.path)

我还在文件中使用了以下内容,但无济于事:

import module.calculations 
import .module.calculations
from . import miscfuncs

尝试import.module.calculations时,我得到以下信息:

ModuleNotFoundError: No module named '__main__.module'; '__main__' is not a package

当尝试from. import miscfuncs 在calculation.py中from. import miscfuncs ,我得到以下错误:

ImportError: cannot import name 'miscfuncs'

在处理模块文件夹中的文件时,我可以使用相对导入: import calculations ,它工作正常。 这对于模块内的文件很好,但当我在 test_calcs.py 中工作时则不行。

在我的 setup.py 中,我有一行:

packages=['module']

如果需要,很高兴发布更多信息或链接到我的存储库以获取完整代码。

编辑

遵循remram的解决方案:

我已经更新launch.json以包含CWDPYTHONPATH变量。

模块名称仍然无法识别,但是 VSCode 中的 IntelliSense 可以很好地提取导入文件中的函数。

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

如果您希望import module.calculations起作用,请确保您从package文件夹(而不是从package/module )运行。 您还可以将PYTHONPATH环境变量设置为package文件夹的路径。

根据你的描述,我没有得到足够的信息,但我想我可以推测有两个关键点你没有意识到。

  • 相对导入只能在 package(或模块)内部使用。

    参考python官方文档模块

    请注意,相对导入基于当前模块的名称。 由于主模块的名称始终为__main__ ,因此用作 Python 应用程序的主模块的模块必须始终使用绝对导入。

    即使calculations.py在package中,但你将它作为“主模块”运行,它也不起作用。

  • 绝对导入的模块(您自己的)应位于您current work directory下(在sys.path或 env PYTHONPATH中的路径下)

    对于它在测试中运行良好的问题,我认为这取决于你的“主模块”工作的目录,你应该仔细检查。

你只需要解决这两点,你就会解决你的问题。

对我有用的是使用pyproject.toml文件:

[tool.pytest.ini_options]
pythonpath = [
  "."
]

@lepidopterist 评论被证明是数小时挣扎的游戏规则改变者......

解决方案:

  1. Ctrl + Shift + P打开命令面板
  2. Go 到Users.setting.json
  3. 添加以下行

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

供参考: Settings.json

解释:

这是我的项目结构......项目

我的项目中有三个模块/包!

  • module_a + module_b:执行独立任务
  • 便利性:为所有其他模块提供实用功能

我想做的事!

  • 将所有实用程序功能保留在便利模块中,并将它们导入到需要它们的任何模块中

什么没有奏效!

  • 相对导入失败

from..convenience.utilities import add

给...

beyond top level package error
  • 绝对进口也失败了

from convenience.utilities import add

给...

ModuleNotFoundError: No module named 'convenience'
  • 将 Workspace 目录添加到 PYTHONPATH 也失败了

"env": {"PYTHONPATH": "${workspaceFolder}"}

给...

ModuleNotFoundError: No module named 'convenience'

为什么解决方案(我在开始时提到?)有效?

  • 因为,我正在使用集成终端运行 module_a/task.py。 有意义的是,需要为添加工作区目录路径的终端附加 Pythonpath。

(需要注意的一件事):我的操作系统是 windows 所以它是......

"terminal.integrated.env.windows"

对于 Linux 它将是......

"terminal.integrated.env.linux"

修改 Users.Setting.json 后的结果:

Output

为了调试 main.py VSCode 需要知道明确的库路径。 这可以通过在 launch.json 中设置环境 ('env') 变量来完成。 第一步是在 .vscode 文件夹中创建一个“launch.json”。

/
├── .vscode/
│   └── launch.json
├── mySubdir/
│   └── myLib.py
└── main.py

如果 main.py 想要将 myLib.py 作为模块导入,VSCode 只有在 mySubDir 是 Python 路径的一部分时才能这样做。

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

{workspaceFolder}{pathSeparator}是预定义的变量,将被 VSCode 替换。

该线程给出了更广泛的解释: How to correct set PYTHONPATH for Visual Studio Code

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM