使用当前文件夹中的模块的VScode Python未解析导入

Posted

技术标签:

【中文标题】使用当前文件夹中的模块的VScode Python未解析导入【英文标题】:VScode Python unresolved import using a module from the current folder 【发布时间】:2020-12-25 02:22:30 【问题描述】:

我正在从某个 project/ 文件夹运行 vscode,并在某个 project/impl/ 文件夹中收到“未解决的导入”错误。在impl/ 文件夹中,我有 2 个 Python 文件:

# lib.py
class A():
    pass

# run.py
from lib import A # vscode error here - unresolved import
...

当运行 run.py 时,Python 解释器发现 lib 很好,但 vscode 显示“未解决的导入”错误 (screenshot)。

如果我将导入行更改为 from .lib import implementation(注意点),我会得到相反的行为,即 vscode 解析导入正常但 Python 解释器失败。

我应该如何导入 lib 或以其他方式配置 vscode 以解析从本地文件夹的导入? (显然我不想将本地文件夹的确切路径添加到 vscode 配置文件,因为我必须为项目中的每个子文件夹都这样做)

【问题讨论】:

“lib.py”文件和“run.py”文件的父文件是否都是“impl”文件夹?我按照目前提供的信息运行后就可以导入使用了,能否提供一个完整的文件目录结构? 要重现 - 从某个文件夹运行 vscode,创建一个子文件夹并在子文件夹中创建两个文件。我添加了一个screenshot。 一旦你有一个带有子目录的项目,最好创建一个(本地)python包。 @Wups 你能解释一下吗? 【参考方案1】:

当我在我的电脑上使用 python 扩展版本 2018.12.1 时,我遇到了和你描述的一样的问题。

由于该功能是语言服务提供的,而python语言服务是由python扩展提供的,建议您可以尝试使用最新版本的python扩展(2020.8.106424)。

另外,您可以使用扩展名“Pylance”,它也为python提供了出色的语言服务。

我在电脑上创建的项目:

我的环境:

VSCode 版本:1.48.2(用户设置)

操作系统:Windows_NT x64 10.0.18362

Python 扩展:2020.8.106424

settings.json 中的语言服务器:

 "python.languageServer": "Pylance",

更新1:

当我使用的语言服务是“Jedi”时,代码也没有这个警告:

"python.languageServer": "Jedi",

更新2:

由于这个警告不影响代码的执行结果,我们也可以在设置中关闭这种警告(settings.json):

"python.analysis.disabled": [
      "unresolved-import"
  ]

这样我们就可以使用"python.languageServer": "Microsoft",

【讨论】:

我正在运行最新版本的 Python 扩展,但问题仍然存在。 Pylance 扩展确实解决了这个问题,尽管我需要测试它在安装时带来的其他变化。 @gilad 我更新了我的答案,您可以尝试参考它。此外,“Pylance”是微软开发的一个扩展,可以与python扩展一起工作,并提供高性能的语言支持。可以参考:Pylance Jedi 似乎可以正确解析导入,但是每当我更改为 jedi 时,vscode 都会尝试恢复到 Microsoft 语言服务器。我希望我也可以配置 Microsoft 语言服务器来解析这些导入。 @gilad 根据您的描述,我在回答中添加了“Update2”,您可以参考一下。 谢谢,但问题不是下划线警告。当语言服务器解析导入失败时,调试时也会跳过相关行,也会拒绝对导入文件中定义的函数和类进行“go to definition - F12”。【参考方案2】:

您可以将文件夹添加到使用sys模块搜索python的模块路径中。

import sys
sys.path.insert(1, "./impl/")

from lib import A

注意,vs 代码仍然可以在导入行下划线,但是,当您运行程序时它会正常工作。试试看!

你可以像这样添加更多路径 -

sys.path.insert(n, <path to folder>)

对于每条新路径,请注意使用新的自然数代替 n。

【讨论】:

vscode 下划线确实是我的问题(这对调试和导航也有影响)。否则代码运行良好。

以上是关于使用当前文件夹中的模块的VScode Python未解析导入的主要内容,如果未能解决你的问题,请参考以下文章

vscode如何配置debug,python正则表达式如何匹配括号,关于python如何导入自定义模块

VSCode python调试:使用模块属性时“没有名为xx的模块”

如何使 VSCode 自动重新加载外部 *.py 模块?

VS Code中多个文件中的断点?

Python 文件不能作为模块正常工作(也许只是在 VScode 中?)

open()函数提示找不对file的解决方法