求Emacs的Python环境配置方案

以下是我的Python应用场景,希望大家给点配置建议

  1. lsp-bridge: C++/VHDL/SystemVerilog/Python 开发,要在多个repo里开启
  2. org-mode + Jupyter:
  3. Python脚本卡发:在非Python项目的repo里,写一些简单Python脚本
  4. Python项目:独立的Python工具,要求支持不同Python版本。

目前,用系统默认环境,安装所有依赖包。经常发生开发的Python脚本和工具无法在其他服务器上运行的问题 (版本不一致,缺少依赖包)。

现在公司在推 uv, 听到很多好评,不知如何在我的应用场景使用。

conda

1 个赞

uv 类似于对 Python 内置工具包和环境管理 pip 和 pyvenv 的包装,和他们的命令基本兼容。所以如果 pip 和 pyvenv 能处理你的场景,那 uv 也可以

uv 支持管理 python 版本,可以针对不同的虚拟环境使用不同的 Python 版本

uv 也支持锁文件 uv.lock,可以锁定具体的包版本,其他机器上也有 uv 的话就可以 uv sync 同步虚拟环境

而且 lsp-bridge 有通过 uv 安装依赖的脚本,这样就不用把 lsp-bridge 的依赖安装到全局环境中(当然这不用 uv 也可以做到,只是不这么便利)

我个人是用 uv 基本代替了 pip 和 pyvenv 的。conda 其实和 uv 不是相互代替的关系,conda 好在可以管理非 Python 依赖。但如果没有这些需求的话,我觉得 uv 基本就能满足了

1 个赞

uv 没什么问题,非常好学,五分钟就会用了。对于新的项目没有基于传统 pip 的历史包袱的,用四个命令就够了 uv init,uv add,uv remove,uv sync。老的 legacy 的项目就直接用 uv pip。再多用一个命令 uv tool 用来安装例如 ranger-fm,yt-dlp 之类的全局 python app。

我是在终端用的,uv 本质仍然是 python venv,source 进虚拟环境一把梭。只是跑脚本的时候方便点,直接 uv run xxx 就完事

org mode 里改下 python 就能适配用 uv run 运行了

#begin_src python :python uv run -
4 个赞

eglot+pyright, clangd 个人没咋用过lsp-bridge,主要是因为c++都是远程开发,不涉及客户端

如果用 venv, 那么用 direnv 就足够了(对应插件 envrc)

eglot uv+ty+ruff

能分享一下配置不?我借鉴一下

先按照官网的教程安装uv,ty和ruff;

配置eglot:

(add-to-list 'eglot-server-programs
             '((python-mode python-ts-mode) . ("ty" "server")))

格式化可以用reformatter包:

(reformatter-define python-format
  :program "ruff"
  :args '("format" "-"))
(add-hook 'python-mode-hook 'python-format-on-save-mode)

代码工程下,可以用uv创建venv后,在pyproject.toml中增加:

[tool.ty.environment]
python = ".venv"

[tool.ruff]
line-length = 88

这样应该就可以用了

我之前用 reformatter 会卡顿,现在换了 apheleia-mode。今天刚发现这个包,感觉配置更简单。

lsp server 推荐ty+ruff,然后可以配置一个elpy

我也用 ty, 但是 ty 现在功能似乎还不完善,但日常算是 基本可用了

  • self.xxx 这个 xxx 无法被 reference
  • 没有 format 功能?

至于 ruff, 似乎 ty 内部自带了自己的诊断功能?不清楚它和 ruff 的关系,官方文档也没有说

ty:code navigation, completions, code actions, auto-import, inlay hints, on-hover help

ruff:linter and code formatter

self.xxx我自己的环境里面完全可以通过xref-find-references获取到呀

我试了下简单类和子类,确实可以了