如何让pylsp识别本地项目子目录中的Python导入?
解决Neovim+pylsp导入识别问题(Python代码在子目录)
问题场景
项目结构如下:
. ├── .git ├── src │ ├── python │ │ ├── foo.py │ │ ├── app │ │ │ └── core.py │ └── lang2 │ ├── bar.lang2 │ └── settings.py ├── system ├── tests │ └── run.py └── util ├── examples │ └── example.py └── run.py
启动搭载pylsp的Neovim时,LSP根目录被设为包含.git的顶层目录,但Python代码实际在src/python子目录,导致以下导入无法识别(跳转定义提示“未找到位置”):
import foo from app import core from app.core import Thing
尝试过PYTHONPATH=src/python/ nvim启动编辑器,无明显效果。
通用解决方案
方案1:添加pyproject.toml(推荐,适配现代Python生态)
在项目顶层目录创建pyproject.toml,直接给pylsp指定源码路径:
[tool.pylsp] extraPaths = ["src/python"]
如果需要同时适配mypy、pytest等工具,可以补充项目基础配置:
[project] name = "your-project-name" version = "0.1.0" packages = [{ include = "*", from = "src/python" }] [tool.pylsp] extraPaths = ["src/python"]
pylsp会自动读取这个文件的配置,把src/python加入模块搜索路径。
方案2:直接配置Neovim的pylsp设置
在Neovim的LSP配置文件(比如init.lua或专门的pylsp配置文件)中,手动给pylsp添加额外路径:
require('lspconfig').pylsp.setup{ settings = { pylsp = { extraPaths = {"src/python"}, -- 可选:优先读取pyproject.toml的配置 configurationSources = {"pyproject.toml"} } } }
这种方式直接作用于pylsp,不受环境变量影响,稳定性更高。
方案3:项目级环境变量(适配多工具场景)
在项目根目录创建.env文件,写入环境变量配置:
PYTHONPATH=./src/python:$PYTHONPATH
然后安装vim-dotenv插件,让Neovim启动时自动加载项目根目录的.env文件,pylsp会继承这个环境变量的路径配置。
补充说明
直接用PYTHONPATH=src/python/ nvim启动无效的原因,通常是Neovim启动时没有正确继承临时环境变量,或者pylsp的内部路径优先级覆盖了系统环境变量。上面的方案都是直接针对pylsp的配置逻辑,更可靠。
内容的提问来源于stack exchange,提问作者Moberg
相关产品推荐
相关产品推荐

