46

这是几个月前在pylance之前使用pylint遇到的类似情况:

我的python 3.9x- 脚本(使用VS Codeon Ubuntu 20.04 LTS)从以下自定义“工具”的导入开始:

import sys
sys.path.append(
    '/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts/'
)

import General.Misc.general_tools as tools

现在,Pylance声明:

Import "General.Misc.general_tools" could not be resolvedPylance (reportMissingImports)

即使在程序执行期间模块被完美地导入,也会发生这种情况。

因此,为了确保Pylance理解这是一个现有的模块路径,除了sys.path.append(..)- 方法之外,我在settings.json- 文件中添加了以下内容:

{
    ...
    // Possible values: "Jedi", "Pylance", "Microsoft", "None".
    "python.languageServer": "Pylance",
    // NOTE on changing from microsoft to pylance language server: python.autoComplete.extraPaths --> python.analysis.extraPaths
    // Docs: https://github.com/microsoft/pylance-release/blob/master/TROUBLESHOOTING.md#unresolved-import-warnings
    "python.analysis.extraPaths": [
        "/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts"
    ],
    ...
}

然而,reportMissingImports即使它被正确导入,我仍然收到 - 消息。

我在这里找到的一种解决方法效果很好(附加# type: ignore到导入语句):

import General.Misc.general_tools as tools  # type: ignore

尽管如此,这只是一种解决方法,这就是为什么我要解决这个问题的根源。从技术上讲,这与我之前使用的相同解决方法来消除来自pylint. 可能这是 - 配置所固有的东西VS-Code settings.json,因为 usingVS-Code是这里的常数因素。


编辑未解决问题的其他措施:

我添加了

export PYTHONPATH="$PYTHONPATH:/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts"

到我的~/.bashrc- 文件,这使我现在可以从终端直接在python-shell 中导入模块,而无需之前的sys-path 操作。然而,这仅适用于全局系统 python 环境,而不适用于任何虚拟环境。为了在那里更改系统路径,我按照这些说明进行操作,而我的特定虚拟环境“scrapy_course”是打开的,如下所示:

(scrapy_course) andylu@andylu-Lubuntu-PC:~/$ add2virtualenv /home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts

此命令适用于virtualenvwrapper ,它与pyenv一起巧妙地管理虚拟环境。sys.path.append(...)现在,即使没有预先导入模块,我也可以在当前环境中运行上述脚本,但pylance仍然无法正确识别路径并向我显示与以前相同的警告。


编辑"python.analysis.useImportHeuristic": true

我已经在我的全局settings.json文件中不断地激活了这个选项,但我仍然没有注意到任何影响。一旦这种情况发生变化,或者最终(不同的)解决方案出现在我面前,我会及时通知您。


编辑抑制/禁用 Pylance 'reportMissingImports' linting-message:

我已经发现了如何完全抑制特定的 Pylance-linting-message,如果你感兴趣的话。特别是在我目前的情况下,无论如何我都需要并行使用pylint,所以我根本不依赖 Pylance 的 linter 。

4

6 回答 6

39

默认情况下,Pylance 包含工作区的根路径。如果您想包含其他子目录作为导入解析路径,您可以使用python.analysis.extraPaths工作区的设置添加它们。

  • 在 VS Code 中按<ctrl> + <,>打开设置。
  • 输入python.analysis.extraPaths
  • 选择“添加项目”
  • 输入您的图书馆的路径/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts/
于 2021-04-13T06:59:04.927 回答
27

下面两种方法:

  1. 在 VS 代码中,您可以编辑该setting.json文件。如果添加"python.analysis.useImportHeuristic": truelinting 错误将被删除。

  2. 另一种方法是# type: ignore在导入代码的末尾添加。

这是我从以下获得上述解决方案的 github 链接:https ://github.com/microsoft/pylance-release/issues/68

它对我有用:python 3.9,,,VScodewindows10

于 2021-04-14T22:23:15.583 回答
5

默认情况下,python 选择全局解释器作为您拥有的任何 python 项目的解释器。所以模块/包解析是在全局上下文中的。对于您用来获取已安装模块的任何 linter,您必须确保选择正确的解释器

例如,如果您曾经使用过 pycharm,它会要求您选择解释器并使用所选解释器创建虚拟环境。同样,如果您在 Visual Studio Code 中启动项目即使您创建虚拟环境,它也会将全局解释器作为默认解释器请参阅左下角的所选解释器部分

在此处输入图像描述

那么如何确保 Pylance/Pylint/ 读取安装在创建的虚拟环境中的模块呢?您需要在左下角检查选择的解释器,如果没有在虚拟环境中激活,请单击选择的解释器,vs-code 会提示您为项目选择默认解释器。选择您当前的虚拟环境,visual studio pylance 将读取当前环境中的模块。希望这适用于任何正在与之斗争的人

在此处输入图像描述

在此处输入图像描述

于 2021-11-24T04:56:48.247 回答
2

我遇到了类似的问题,即使在我的系统上有包之后,VS Code Pylance 也无法解决导入问题。

就我而言,我安装了 2 个不同版本的 python(一个使用 anaconda 发行版,另一个直接来自 python.org)

修复:在 VS 代码中选择正确的 Python 解释器。Pylance 将停止抱怨 :)

在此处输入图像描述

于 2021-10-31T06:04:02.643 回答
1

另一种选择是.env在 vscode 项目的根目录中添加一个文件。例如:

.env

PYTHONPATH=src/mydir

您可以使用上面的相对路径,也可以使用完整路径。这样做的好处.env是它可以同时pylancepylintvscode 中修复。而且它git.vscode/settings.json.

于 2022-01-14T19:22:42.347 回答
0

Pylance是用于 python 项目的默认语言服务器,除非您另外指定。如果您(reportMissingImports)确定依赖项已成功安装,则意味着它安装在 Pylance 预期之外的其他位置。如果您使用虚拟环境,通常会发生这种情况。

Pylance 默认为任何 python 项目选择系统 python 解释器,在这种情况下,你需要通过定义你的vscode 设置来告诉 Pylance 在哪里可以找到 virtualenv python 解释器。在.vscode/settings.json下面添加以下内容:

{
    "python.defaultInterpreterPath": "~/.pyenv/versions/3.10.2/envs/<my-virtual-env-name>/bin/python",
    "python.linting.ignorePatterns": [
        "**/site-packages/**/*.py"
    ],
}

现在 Pylance 将确切地知道在哪里寻找已安装的依赖项。就我而言,我正在使用pyenv,但它可能是任何其他路径,具体取决于您使用的 virtualenv 工具。如果您在其他自定义位置有其他依赖项,您可以通过指定添加它们"python.analysis.extraPaths"

{
    "python.defaultInterpreterPath": "~/.pyenv/versions/3.10.2/envs/<my-virtual-env-name>/bin/python",
    "python.linting.ignorePatterns": [
        "**/site-packages/**/*.py"
    ],
    "python.analysis.extraPaths": [
        "my-custom-path-1/python/scripts", 
        "my-custom-path-2/something-else"
    ],
}
于 2022-02-24T09:33:29.300 回答