【问题标题】:VSCode ModuleNotFoundError: No module named XVSCode ModuleNotFoundError:没有名为 X 的模块
【发布时间】:2020-10-03 13:34:44
【问题描述】:

我正在尝试构建一个新包,但是,当我尝试从 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) 并在 test_calcs.py 中使用 import module.calculations as calcfrom module.calculations import Class 时,测试按预期工作 - 这让我感到困惑。

我知道这是一个常见问题,但我想不出一个在这里可行的解决方案。

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

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

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

【问题讨论】:

  • 我被困在这个问题上很长时间了。我弄清楚这一点的关键是研究 VSCode 和 PyCharm 在处理源或根目录的概念方面的区别。在 PyCharm 中,事情对您来说非常容易,但在 VSCode 中,您必须经历更多的麻烦。我更改了 launch.json 和 settings.json 文件以将 PYTHONPATH 定义为 "terminal.integrated.env.linux": {"PYTHONPATH": "${workspaceFolder}/src",},

标签: python visual-studio-code


【解决方案1】:

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

【讨论】:

  • 如何从 VSCode 中的包文件夹运行?我猜绿色运行按钮正在其当前位置执行文件?另外,如果我设置了 PYTHONPATH,这将如何影响其他用户在 pip 安装时使用该库?
  • 看看这个问题:stackoverflow.com/questions/38623138/…。设置PYTHONPATH 不会影响其他用户,只要您将其设置为标准目录(例如,您的setup.py 所在的顶级目录)
  • 我已按照 CermakM 的回复设置 CWD 和 PYTHONPATH,将 "cwd": "${workspaceFolder}""env": {"PYTHONPATH": "${cwd}" 添加到 launch.json。在测试和模块目录中包含的文件中使用绝对导入时,错误仍然存​​在。我可能错过了一些简单的东西。
【解决方案2】:

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

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

    参考python官方文档Modules

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

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

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

    对于在测试中可以正常工作的问题,我认为这取决于你的“主模块”工作的目录,你应该仔细检查。

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

【讨论】:

    猜你喜欢
    • 2019-12-02
    • 2022-07-07
    • 1970-01-01
    • 2021-05-16
    • 2020-03-11
    • 2019-03-28
    • 1970-01-01
    • 2017-09-29
    • 2022-01-07
    相关资源
    最近更新 更多