python - VS Code / Pylance / Pylint 无法解析导入
问题描述
摘要
我有一个从 VS Code 终端运行时可以使用的 python 导入,但是 VS Code 的编辑器会发出警告。此外,“转到定义”不起作用。
问题
我从图像创建了一个 docker 容器tensorflow/tensorflow:1.15.2-py3
,然后使用 VS Code 的“Remote-Containers”扩展附加到它。然后我在容器中创建了以下文件。
主要.py:
import tensorflow.compat.v1 as tf
print(tf.__version__)
这在 VS Code 终端中运行良好,但编辑器和问题窗格都给了我一个unresolved import 'tensorflow.compat'
警告。“转到定义”也不适用于tf.__version__
.
我正在使用几个扩展,但我相信相关的是 Microsoft Python 扩展(安装在容器中),以及 Remote - Containers 扩展,现在是 Pylance 扩展(安装在容器中)。
我尝试过的事情
我已经用 default 试过了pylint
,然后在安装后也pylance
得到了类似的结果。我也看过一些关于类似问题的文档,但它们与为作为项目一部分的模块设置正确的源文件夹位置有关。相比之下,我项目中的代码似乎可以很好地处理导入/转到定义。外部库似乎不起作用。
另外,为了这个最小的例子,我以 root 身份附加到容器,所以我猜这不是权限提升的问题。
我还尝试禁用除以下之外的所有扩展,但得到了相同的结果:
- 远程 - 容器(本地)
- 远程 - WSL(本地)
- Python(在容器上)
- Jupyter(在容器上,Python 出于某种原因需要)
上面的所有扩展都是最新版本。
我也摆弄过设置python.autocomplete.extraPaths
,但我不确定正确的路径是什么。必须将库添加到全局 python 安装中安装的路径似乎也是错误的事情,特别是因为我没有使用虚拟环境(它位于 docker 容器中)。
问题
如何修复 VS Code 以便它识别此导入并且我可以使用“转到定义”来探索这些 tensorflow 函数/类/等?
解决方案
tldr;
TensorFlow 以 pylint 和 pylance 无法识别的方式定义了它的一些模块。这些错误不一定表示设置不正确。
修理:
- pylint:安全地忽略 pylint 警告。
- Intellisense:目前我所知道的修复 Intellisense 的最佳方法是用它们别名的模块替换导入(通过在 repl as
x
then running中导入 alias 找到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
,看起来第二个包名称是一个内部命名空间,所以我猜最好只使用这个内部名称进行本地调试。
确认/门票
- pylint:我发现了一张关于 pylint与一些看起来相关的 tensorflow 导入有问题的票。
- Intellisense:我用 pylance开了一张票。
推荐阅读
- ide - Office JS Excel 插件的首选 IDE
- php - 特定 wordpress 管理页面上的挂钩脚本
- ios - 从IOS应用程序同时多次查询数据库导致崩溃
- python - 使用 numpy 表示具有未知结构的(可能很大)图的有效方法?
- sql-server - 如何从一台服务器调用 MS SQL 服务器作业到另一台服务器作业 - 互连 2 SQL 服务器作业
- r - 添加扩展 snaive 的自定义预测功能
- r - 在计算平均值时,如何仅包含满足特定条件的行?
- jenkins - 安装后无法看到 Jenkins 主页
- jquery - 使用 jQuery 设置输入值后更新 Angular 8 模型
- python - 如何将句子输入中的空格替换为输出中的破折号