使用当前文件夹中的模块的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的模块”