【问题标题】:VS Code / Pylance / Pylint Cannot resolve importVS Code / Pylance / Pylint 无法解析导入
【发布时间】:2021-03-24 01:15:43
【问题描述】:

总结

我有一个从 VS Code 终端运行时可以使用的 python 导入,但是 VS Code 的编辑器会发出警告。此外,“转到定义”也不起作用。

问题

我从图像tensorflow/tensorflow:1.15.2-py3 创建了一个 docker 容器,然后使用 VS Code 的“Remote-Containers”扩展附加到它。然后我在容器中创建了以下文件。

main.py:

import tensorflow.compat.v1 as tf
print(tf.__version__)

这在 VS Code 终端中运行良好,但编辑器和问题窗格都给我一个 unresolved import 'tensorflow.compat' 警告。 “转到定义”也不适用于 tf.__version__。

我正在使用几个扩展,但我相信相关的是 Microsoft Python 扩展(安装在容器中),以及 Remote - Containers 扩展,现在是 Pylance 扩展(安装在容器中)。

我尝试过的事情

我已经用默认的pylint 进行了尝试,然后在安装pylance 之后也得到了类似的结果。我还看到了一些关于类似问题的docs,但它们与为作为项目一部分的模块设置正确的源文件夹位置有关。相比之下,我的代码在我的项目中 似乎可以很好地处理导入/转到定义。 外部库似乎不起作用。

另外,为了这个最小的例子,我以 root 身份附加到容器,所以我猜这不是提升权限的问题。

我也尝试禁用除以下之外的所有扩展,但得到了相同的结果:

  • 远程 - 容器(本地)
  • 远程 - WSL(本地)
  • Python(在容器上)
  • Jupyter(在容器上,Python 出于某种原因需要)

以上所有扩展都是最新版本。

我也摆弄过设置python.autocomplete.extraPaths,但我不确定正确的路径是什么。必须将库添加到全局 python 安装中安装的路径似乎也是错误的事情,特别是因为我没有使用虚拟环境(它位于 docker 容器中)。

问题

如何修复 VS Code 以使其识别此导入并且我可以使用“转到定义”来探索这些 tensorflow 函数/类/等?

【问题讨论】:

  • 一般这样的问题可以通过扩展来解决,或者有时是使用错误的副作用。您是否四处寻找可以处理您尝试完成的工作流程的扩展?您安装的智能感知完全有可能无法理解您正在使用的配置。
  • 我正在使用 Microsoft 的 Python 扩展、Remote - Containers 扩展、Pylance 扩展等。我不确定您所说的“这样的问题可以通过扩展来解决”是什么意思。我相信我拥有的这些扩展应该可以解决问题,但我无法正确配置它们。
  • 我所说的有一个重要的警告:您可能安装了错误的。验证您安装了哪些扩展,检查任何可能不兼容的扩展。如有疑问,请卸载您所拥有的,并有选择地重新安装您需要的。这不是任何人都可以帮助您解决问题的。

标签: python tensorflow visual-studio-code pylint pylance


【解决方案1】:

我遇到了同样的问题,但使用了各种包。 我的解决方案是转到 VSCode 设置并搜索 "python.analysis.extraPaths",然后将路径添加到您的站点包。

就我而言,我添加了C:\Code\Python39\Lib\site-packages,现在它工作正常。

【讨论】:

    【解决方案2】:

    所以对我来说,我正在尝试

    import pandas as pd
    

    但我得到了错误

    "pd" is not accessedPylance (module) pd
    

    所以我所做的是重新加载扩展 Python IntelliSense(Pylance) 并解决了我的问题。

    【讨论】:

      【解决方案3】:

      tldr;

      TensorFlow 以 pylint 和 pylance 无法识别的方式定义了它的一些模块。这些错误不一定表示设置不正确。

      修复:

      • pylint: 安全地忽略 pylint 警告。
      • Intellisense: 目前我所知道的修复 Intellisense 的最佳方法是将导入替换为它们具有别名的模块(通过在 repl 中将别名导入为 x 然后运行 ​​help(x) 来找到) .因为在我的例子中别名的目标是一个内部名称,所以您可能不想将这些更改签入源代码管理。不理想。

      详情

      关于 linting:似乎 tensorflow 以工具无法理解的方式定义其模块。此外,该包似乎是另一个包的某种别名。例如:

      import tensorflow.compat.v1 as tf
      tf.estimator.RunConfig()
      

      上面的代码给出了 pylint 警告并破坏了智能感知。但是,如果您在 REPL 中手动导入上述内容并运行 help(tf),它会显示以下包,您可以使用它来代替:

      import tensorflow_core._api.v1.compat.v1 as tf
      tf.estimator.RunConfig()
      

      第二个示例不会导致 pylint 警告。 Intellisense 功能(Go to definition、Ctrl+Click 等)也适用于第二个示例。

      但是,基于_api,看起来第二个包名称是一个内部命名空间,所以我猜最好只使用这个内部名称进行本地调试。

      确认/门票

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        • 2021-03-23
        • 2022-11-19
        • 2022-08-12
        相关资源
        最近更新 更多