Neovim LSP中pyright无法动态识别子文件夹代码变更问题
Neovim Pyright 跨文件新增方法无法实时识别问题
问题表现
- 基于
nvim-lspconfig与lsp-installer配置Neovim LSP,安装pyright作为Python语言服务,初始状态无额外配置可正常使用 - 异常:子文件夹类中新增方法后,跨文件访问时pyright无法识别;仅重启Neovim,或打开对应定义文件再关闭后,pyright才可识别新增方法,执行
:LspRestart命令无改善效果
已尝试操作
- 为pyright添加如下配置,未解决问题:
return { settings = { python = { analysis = { autoSearchPaths = true, diagnosticMode = "workspace", useLibraryCodeForTypes = true, } } }, }
- 执行
:LspLog查看日志,未发现指向问题根源的有效信息,日志内容如下:
[START][2022-07-15 11:11:05] LSP logging initiated [WARN][2022-07-15 11:11:09] ...lsp/handlers.lua:109 "The language server pyright triggers a registerCapability handler despite dynamicRegistration set to false. Report upstream, this warning is harmless" [WARN][2022-07-15 11:11:09] ...lsp/handlers.lua:456 "stubPath typings is not a valid directory." [WARN][2022-07-15 11:11:20] ...lsp/handlers.lua:109 "The language server pyright triggers a registerCapability handler despite dynamicRegistration set to false. Report upstream, this warning is harmless"
- 查阅pyright官方设置文档,未找到对应解决配置项
项目结构
当前项目目录规则:
- 根目录放置入口文件
main.py - 其余源码文件存放在**无
__init__.py**的program/文件夹下 program/内的子文件夹(如core/)均自带__init__.py文件
其中core/__init__.py内容:
from .myClass import myClass
main.py中导入调用逻辑:
from subfolder.core import myClass myClass.newMethod() # 仅关闭重开对应定义文件后,才可被pyright识别
问题根因
该问题既不是pyright bug,也不是配置缺失,核心原因是Python项目包结构不规范:
Python的包识别规则为,包含__init__.py的目录才会被判定为正规可导入包,pyright默认仅对纳入正规包范围的目录做实时文件变更监听。你存放核心源码的program/目录没有__init__.py,不会被pyright纳入实时索引范围,仅在文件被打开/关闭的瞬间做单次索引更新,因此会出现新增方法无法实时识别、必须关文件/重启编辑器才生效的现象。
日志中的两条警告均与该问题无关:registerCapability相关警告是pyright与nvim-lspconfig的已知兼容提示,不影响功能;stubPath typings警告仅提示未创建类型存根目录,不影响常规代码检查。
修复方法
在program/目录下新增空的__init__.py文件,将源码目录标记为正规Python包即可。修复后pyright会自动监听该目录下所有文件变更,新增、修改类方法后跨文件可实时识别,无需重启LSP或重开文件。
内容的提问来源于stack exchange,提问作者goTAN
相关产品推荐
相关产品推荐

