Emacs配置Python IDE,通过Pyright LSP

news/2026/1/18 15:13:59/文章来源:https://www.cnblogs.com/xiaoma2018/p/19498546

Emacs配置Python IDE,通过Pyright LSP

本文为和 AI 大模型 Gemini 的对话记录,仅供参考。


配置 Emacs 成 Python IDE

Emacs 如何配置 Python IDE 代码提示功能,要支持虚拟环境


在 Emacs 中配置 Python IDE 功能,目前最主流、最强大的方案是使用 LSP (Language Server Protocol)。通过配合 pyrightbasedpyright(微软开发的静态类型检查器),可以实现极快的代码补全、跳转、重构,并完美支持虚拟环境。

以下是基于 use-package 的配置方案:


1. 核心插件安装与配置

你需要安装 lsp-mode(提供协议支持)和 lsp-pyright(Python 专用的后端适配)。

(use-package lsp-mode:ensure t:hook ((python-mode . lsp-deferred)):commands (lsp lsp-deferred):config(setq lsp-completion-provider :capf))(use-package lsp-pyright:ensure t:hook (python-mode . (lambda ()(require 'lsp-pyright)(lsp-deferred))))

2. 支持虚拟环境 (Venv)

处理虚拟环境有两种主要方式,推荐方案 A(自动切换)。

方案 A:使用 pyvenv 插件 (推荐)

这是最灵活的方式。你可以手动切换环境,或者让 Emacs 识别当前目录下的 .venv

(use-package pyvenv:ensure t:config(pyvenv-mode 1);; 设置默认的虚拟环境目录(如果你统一管理 venv);; (setq pyvenv-workon "~/anaconda3/envs") )

如何使用:

  • 执行 M-x pyvenv-workon 选择已有的虚拟环境。
  • 执行 M-x pyvenv-activate 手动指定路径。
  • 关键点: 激活虚拟环境后,重启 LSP (执行 M-x lsp-restart-workspace),补全功能就会自动识别该环境中的包。

方案 B:项目本地配置文件 (不安装插件)

在你的项目根目录下创建一个 pyrightconfig.json 文件:

{"venvPath": "/path/to/your/envs/folder","venv": "env-name"
}

LSP 会自动读取此文件并链接到正确的 Python 解释器。


3. 增强 UI 与补全体验

为了让补全弹窗更好看,建议配置 companylsp-ui

;; 代码补全前端界面
(use-package company:ensure t:config(setq company-idle-delay 0.0company-minimum-prefix-length 1)(global-company-mode t));; 侧边栏与悬浮文档
(use-package lsp-ui:ensure t:commands lsp-ui-mode:config(setq lsp-ui-doc-enable tlsp-ui-peek-enable t))

4. 外部依赖准备

在你的终端(Terminal)中,确保安装了 Pyright 服务端,否则 Emacs 无法与其通信:

# 使用 npm 全局安装(推荐)
npm install -g pyright# 或者在你的 Python 虚拟环境中安装
pip install pyright

总结你的操作流程

  1. 编辑配置:将上述 Elisp 代码加入你的 .emacsinit.el
  2. 进入项目:打开一个 .py 文件。
  3. 激活环境:执行 M-x pyvenv-activate 并指向你的虚拟环境目录。
  4. 启动 LSPM-x lsp(如果 hook 没自动触发)。

需要我帮你针对特定的管理工具(比如 Poetry 或 Conda)优化配置吗?


Pyright LSP 的安装方法区别

系统安装(Python)和 NPM 安装

sudo zypper install python313-pyright 用这个命令安装的pyright能全局使用吗?


简单来说:可以用,但你需要微调下 Emacs 的配置。

通过 sudo zypper install python313-pyright 安装后,它在 openSUSE 系统中是全局可用的。不过,这种安装方式与常用的 npm 安装版有一个微小的区别,这可能会导致 Emacs 找不到它。

1. 为什么会有区别?

  • 标准版(NPM): 命令通常是 pyright-langserver
  • openSUSE 版: 因为是作为 Python 3.13 的一个模块打包的,它安装的可执行文件名称通常带有版本号,或者是 pyright 而不是 pyright-langserver

2. 如何在 Emacs 中适配?

如果你发现配置了 lsp-pyright 后 Emacs 提示找不到服务器,请在你的配置文件中加入以下设置,显式指定命令路径:

(use-package lsp-pyright:ensure t:custom;; openSUSE 默认可能将可执行文件命名为 pyright;; 你可以在终端输入 `which pyright` 或 `which pyright-python3.13` 确认(lsp-pyright-langserver-command "pyright") :hook (python-mode . (lambda ()(require 'lsp-pyright)(lsp-deferred))))

3. 如何确认是否安装成功?

在终端运行以下命令:

# 检查命令是否存在
which pyright# 检查版本
pyright --version

如果能正确输出路径(通常在 /usr/bin/pyright),那么它就是全局可用的。

4. 虚拟环境支持依然有效吗?

有效。 即便 Pyright 是全局安装的,它依然具有“扫描”能力。当你使用我上一个回答中提到的 pyvenv 插件激活虚拟环境后,Pyright 会自动识别到当前环境的 site-packages

提示: > 这种安装方式的一个优点是:它不依赖 Node.js 运行时(因为 openSUSE 的这个包通常已经处理好了 Python 绑定),对于不想在系统里装 npm 的开发者非常友好。

你想让我演示一下如何通过 shell 命令检测你当前系统里 Pyright 的具体可执行文件名吗?

虚拟环境中安装 pyright 的问题

在每个虚拟环境里自己安装pyright有什么问题?


在每个虚拟环境里单独安装 pyright 并没有技术上的“错误”,但从工程实践和 Emacs 配置的角度来看,它会带来一些明显的麻烦

以下是为什么通常建议只安装一个全局 Pyright 的原因:

1. 配置复杂度增加

Emacs 的 lsp-mode 需要知道 pyright-langserver 可执行文件的位置。

  • 全局安装: 你只需要在 init.el 里指定一次路径(例如 /usr/bin/pyright),它在所有项目中都能工作。
  • 环境内安装: 你必须动态地告诉 Emacs :“去当前的虚拟环境 bin 目录下找 pyright”。如果配置没写好,切换项目时 LSP 经常会因为找不到服务器而报错。

2. 冗余与磁盘占用

pyright 是一个静态分析工具,本质上并不依赖你项目里的具体代码逻辑。

  • 每个环境都装一遍,意味着每个项目都要多出几十 MB 的依赖。
  • 如果你有 20 个 Python 项目,你就要维护 20 个 pyright 的版本更新。

3. LSP 服务器的生命周期冲突

这是最容易出问题的地方:

  1. 你打开 Emacs,启动了项目 A 的 LSP(使用的是环境 A 里的 pyright)。
  2. 你切换到项目 B(环境 B)。
  3. 如果 Emacs 尝试复用之前的 LSP 进程,它可能还在用环境 A 的 pyright 解释器,导致无法正确识别环境 B 的库。
  4. 使用全局 Pyright 配合 pyvenv 切换环境,LSP 只需要重启或重新扫描路径,逻辑更清晰。

4. 核心逻辑:工具 vs 依赖

我们需要区分两种概念:

  • 依赖 (Dependencies):如 flask, pandas。这些必须装在虚拟环境里,因为项目运行需要它们。
  • 工具 (Tools):如 pyright, black (格式化), flake8 (语法检查)。这些是给编辑器用的。

最佳实践是:编辑器工具全局化,项目依赖环境化。


什么时候“必须”在环境里安装?

虽然不推荐,但有一种情况你可能需要这样做:

  • 版本锁定:某个旧项目必须配合特定版本的 pyright 才能通过类型检查,而全局版本太新导致误报大量错误。

推荐的终极方案

为了兼顾“全局安装”的简洁和“虚拟环境”的准确,建议按照以下逻辑操作:

  1. 全局安装sudo zypper install python313-pyright
  2. Emacs 固定路径:在配置中写死指向这个全局路径。
  3. **配置 pyrightconfig.json**:在每个项目根目录放一个简单的配置文件,告诉全局 Pyright 去哪里找当前环境的包:
{"venvPath": "/home/user/.local/share/venvs", // 虚拟环境所在的父目录"venv": "my-project-env"                    // 具体的环境文件夹名
}

你需要我帮你写一段 Emacs 自动识别项目 .venv 目录并告知 Pyright 的高级配置脚本吗?


最后安装和配置

既然你已经有了 pyright-langserver 命令,说明 openSUSE 的这个包已经帮你处理好了路径映射。这是最理想的情况,因为 lsp-pyright 默认寻找的就是这个命令。

以下是适配你当前环境的最佳配置方案,重点在于如何让全局pyright-langserver 能够精准识别局部虚拟环境中的第三方库。

1. 核心 Emacs 配置

将以下代码加入你的配置文件。这段配置的作用是:使用全局命令,但允许通过插件切换环境。

(use-package lsp-pyright:ensure t:custom;; 显式指定你刚刚确认的命令(lsp-pyright-langserver-command "pyright-langserver"):hook (python-mode . (lambda ()(require 'lsp-pyright)(lsp-deferred))))(use-package pyvenv:ensure t:config(pyvenv-mode 1))

2. 关键:如何让全局 Pyright 识别虚拟环境?

当你打开一个项目并激活虚拟环境(M-x pyvenv-activate)后,Pyright 往往需要你明确告知它“去哪里找包”。你有两种优雅的方式:

方法 A:自动识别(推荐)

在你的项目根目录下(与 .venv 文件夹同级)创建一个 pyrightconfig.json 文件:

{"include": ["src", "tests"], // 你的源代码目录"venvPath": ".",             // 告诉 Pyright 在当前目录找虚拟环境"venv": ".venv"              // 你的虚拟环境文件夹名字
}

优点: 只要你打开这个项目,Pyright 就能自动定位到 .venv 里的库,无需任何手动操作。

方法 B:动态告知 LSP

如果你不想在每个项目里写 JSON 文件,可以在激活虚拟环境后,重启 LSP 工作区:

  1. M-x pyvenv-activate -> 选择你的环境路径。
  2. M-x lsp-restart-workspace
    LSP 在重启时会读取当前的 exec-path 和环境变量,从而定位到正确的 Python 解释器。

3. 验证配置是否生效

打开一个 Python 文件,执行以下步骤:

  1. 输入 M-x lsp
  2. 查看 *lsp-log* Buffer,确认没有 "Command not found" 报错。
  3. 导入一个只在虚拟环境中有的包(例如 import pandas)。
  4. 测试跳转:将光标放在 pandas 上,按 M-. (lsp-find-definition)。
  • 如果跳转到了虚拟环境路径下的代码,说明配置完美。
  • 如果提示找不到,说明 Pyright 还在看系统的 Python 路径。

进阶:如果你想更自动化

如果你希望每次进入项目文件夹,Emacs 自动激活对应的 .venv,可以安装 direnv 配合 emacs-direnv

你需要我为你提供一套基于 direnv 的“进入目录即自动切换环境”的自动化脚本吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1178545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

养老机器人技术原理是什么,马博士揭秘核心奥秘 - 工业品牌热点

在老龄化程度持续加深的当下,智慧养老正成为破解养老服务供给难题的关键路径,而养老机器人作为智慧养老生态的核心载体,其技术深度与场景适配能力直接决定了服务质量的高低。面对市场上功能各异、技术路线不同的养老…

生活道理(不定期更新)

仅供参考。 1.刀在好人手里是厨具,在坏人手里是凶器,不要乱递刀,递刀前要看人品。 2.三次不回就不用联系了,朋友只存在于重视你的人之中。选人可以通过这个人身上发生的事情或者产生事情来看这个人。 3.说话的人要注意用别人能接受…

【毕业设计】基于SpringBoot+Mysql的乐器社区网站基于springboot+微信小程序的乐器宣传平台(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Nginx Lua 集成及配置使用详解

Nginx Lua 使用详解 一、安装与配置 1. 安装 OpenResty(推荐) # Ubuntu/Debian sudo apt-get install -y software-properties-common sudo add-apt-repository -y ppa:openresty/ppa sudo apt-get update sudo apt-get install -y openresty openresty-…

SpringAI-本地大模型

1.本地大模型的定义 本地⼤模型( Local Large Model )是指不依赖于云端计算资源,⽽是部署和运⾏在本地设备上的 ⼤规模⼈⼯智能模型。这些模型通常具有较强的计算能⼒和存储需求,因此通常在⾼性能的本地硬件 (如⾼性能…

小程序毕设选题推荐:基于springboot+微信小程序的乐器宣传平台乐器维修保养系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

互联网大厂Java面试场景:从Spring Boot到微服务的关键技术问答

面试场景 在一家互联网大厂的会议室中,程序员超好吃正紧张地坐在面试官对面。面试官是一位眉头紧锁的技术专家,准备对超好吃进行一场技术深度考察。面试围绕内容社区与UGC场景展开。第一轮提问:基本技术点 面试官:我们公司主要做内…

行业权威发布:2026年阿里巴巴十大代运营商排名,昊客网络强势入榜 - 深圳昊客网络

代运营新势力:昊客网络如何突围? 2026年,阿里巴巴1688平台的流量分配逻辑正经历深刻变革。过去“上传产品就能接单”的时代一去不返,取而代之的是对店铺动销率、买家停留时长、供应链响应速度等综合指标的严苛考核…

使用vscode推送博客园博客

使用vscode推送博客园博客 vscode插件 ctrl+shift+p 输入cnblogs选择

重庆思庄技术分享——Flex ASM环境中crsd无法启动造成Grid Infrastructure (GI) 启动失败

Flex ASM环境中crsd无法启动造成Grid Infrastructure (GI) 启动失败要 在一个Flex ASM环境里, Grid Infrastructure (GI) 启动失败, 而这时其它的一个或者多个节点上GI正在运行, 并且 “crsctl …

计算机小程序毕设实战-基于springboot+微信小程序的乐器宣传销售平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Charts Factory 鼠标悬停显示数值信息实现详解

Charts Factory 鼠标悬停显示数值信息实现详解 在 charts_factory.py 中,鼠标悬停显示数值信息的功能通过 PySide6 的信号槽机制和工具提示系统实现。以下是详细的实现原理和流程: 1. 核心实现机制 1.1 信号连接机制 在创建每种图表类型时,都…

手机共享位置的技术原理解析

在社交软件、出行平台和家庭守护类应用中,手机共享位置几乎已经成为默认能力。表面上看,它只是把手机当前的经纬度展示给另一个人,但在工程上,这其实是一个融合定位、系统调度、网络通信与隐私控制的综合问题。 位置是如何被计算…

2026年行业内有实力的升降机公司排名,登车桥/装卸平台/自行走升降平台/防爆升降机/防爆升降机,升降机供应厂家怎么选择 - 品牌推荐师

近年来,随着工业自动化、物流仓储及建筑领域对高效作业设备的需求激增,升降机行业迎来技术升级与市场分化的双重挑战。一方面,智能化、模块化、高安全性的产品成为主流趋势;另一方面,客户对全生命周期服务能力的要…

Windows文件传输命令大汇总

Windows文件传输命令大汇总 在Windows系统间或从网络服务器传输文件时,你是否遇到过BITS服务报错“不支持必要的HTTP协议”?本文将为你系统梳理Windows下各种文件传输命令,从标准工具到非常规技巧,帮你成为文件传输高手。 一、核心…

甘肃万通汽修技工学校排名及优势解读 - 工业品牌热点

2026年技能型社会建设持续推进,优质技工教育已成为青年实现职业理想、企业填补人才缺口的核心支撑。无论是契合产业需求的专业设置、理实一体化的实战教学,还是技能+学历双提升的培养路径,靠谱院校的专业能力直接决…

【课程设计/毕业设计】基于微信小程序的乐器宣传平台基于springboot+微信小程序的乐器宣传平台【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

进制转化入门 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

数据库备份的 10 分钟里,接了个 SQL 优化单:甲方给了执行计划,改 3 行代码,结款比备份还快

数据库备份的 10 分钟里,接了个 SQL 优化单:甲方给了执行计划,改 3 行代码,结款比备份还快周三下午四点半,我点击了数据库备份按钮——后台提示预计耗时12分钟,盯着进度条一点点蠕动的间隙,顺手点开了【程序员接…

基于深度学习的大地电磁反演方法研究

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅成品或者定制,扫描文章底部微信二维码。(1) GoogLeNetINV神经网络架构设计与大地电磁反演模型构建大地电磁测深法是一种利用天…