VSCode ModuleNotFoundError:没有名为 X 的模块

roc*_*tor 29 python visual-studio-code

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

ModuleNotFoundError: No module name 'x'
Run Code Online (Sandbox Code Playgroud)

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

package
|---module
|------__init__.py
|------calculations.py
|------miscfuncs.py
|---tests
|------__init__.py
|------test_calcs.py
|---setup.py
|---requirements.txt
Run Code Online (Sandbox Code Playgroud)

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

我知道这是一个常见问题,但我无法找出适用于此的解决方案。

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

import sys
print(sys.path)
Run Code Online (Sandbox Code Playgroud)

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

import module.calculations 
import .module.calculations
from . import miscfuncs
Run Code Online (Sandbox Code Playgroud)

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

ModuleNotFoundError: No module named '__main__.module'; '__main__' is not a package
Run Code Online (Sandbox Code Playgroud)

当尝试from . import miscfuncs在calculations.py中时,我收到以下错误:

ImportError: cannot import name 'miscfuncs'
Run Code Online (Sandbox Code Playgroud)

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

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

packages=['module']
Run Code Online (Sandbox Code Playgroud)

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

编辑

以下是雷姆拉姆的解决方案:

我已更新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}"
        }
    }
    ]
Run Code Online (Sandbox Code Playgroud)

小智 22

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

解决方案:

  1. Ctrl + Shift + P打开命令面板
  2. 转到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
Run Code Online (Sandbox Code Playgroud)
  • 绝对导入也失败了

from convenience.utilities import add

给了...

ModuleNotFoundError: No module named 'convenience'
Run Code Online (Sandbox Code Playgroud)
  • 将 Workspace 目录添加到 PYTHONPATH 也失败

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

给了...

ModuleNotFoundError: No module named 'convenience'
Run Code Online (Sandbox Code Playgroud)

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

  • 因为,我使用集成终端运行 module_a/task.py 。这是有道理的,Pythonpath 需要附加到我们添加工作空间目录路径的终端。

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

"terminal.integrated.env.windows"
Run Code Online (Sandbox Code Playgroud)

对于 Linux 来说,这将是...

"terminal.integrated.env.linux"
Run Code Online (Sandbox Code Playgroud)

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

输出


rem*_*ram 7

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


Fra*_*ood 5

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

\n
/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .vscode/\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 launch.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mySubdir/\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 myLib.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.py\n
Run Code Online (Sandbox Code Playgroud)\n

如果 main.py 想要将 myLib.py 作为模块导入,则仅当 mySubDir 是 Python 路径的一部分时,VSCode 才能执行此操作。

\n

示例 launch.json:

\n
{\n    "version": "0.2.0",\n    "configurations": [\n        {\n            "name": "Python: Current File",\n            "type": "python",\n            "request": "launch",\n            "program": "${file}",\n            "console": "integratedTerminal",\n            "cwd": "${fileDirname}",\n            "env": {"PYTHONPATH": "${workspaceFolder}/mySubdir:${env:PYTHONPATH}"},\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

{workspaceFolder}是一个预定义变量,将被 VSCode 替换。我也使用了{pathSeparator}但发现它在 Linux 中不起作用,所以现在我使用 \':\' 代替。

\n

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

\n