大部分的Linux发行版都会阻止使用pip全局安装Python包,因为Linux有包管理器。但是这会带来几个问题:
- 像Debian这种比较保守的仓库,所需的py包版本过低
- 很多py包依赖只是单独的某个插件使用,装在全局并不好
- 不同软件对某个py包有不同的版本要求
所以我想让Emacs包使用一个py虚拟环境。但同时我又想用Emacs写Python程序,开发环境又和包需要的虚拟环境不一样。我应该怎么配置。
大部分的Linux发行版都会阻止使用pip全局安装Python包,因为Linux有包管理器。但是这会带来几个问题:
所以我想让Emacs包使用一个py虚拟环境。但同时我又想用Emacs写Python程序,开发环境又和包需要的虚拟环境不一样。我应该怎么配置。
配合
设置 lsp-bridge-python-command
即可。大部分需要 python 依赖的 emacs 包都支持配置专门的 python 路径。
我个人的想法是:所谓的Python虚拟环境只是一套环境变量,这个环境变量的设置脚本是<ENV_PATH>\bin\activate
并不复杂,那么我完全可以用elisp脚本去把应该加的环境变量给setenv
进去。这样用Emacs去调用的py脚本就有需要使用的环境变量了。
看lsp-bridge的wiki
您是指的“pyenv配置”这个词条吗?这个我之前看过了。我用的是Python3自带的venv,这个Python是系统自带的。
而pyenv是源码编译python。这些py的编译时的prefix是不同的,所以它们自然有不同的环境。这样看的话,源码编译py这个方案是最简单,最稳健的。因为环境变量可能会改变别的程序的行为。
直接将 python binary 的路径替换成你虚拟环境下的 python 绝对路径就行。
...venv/bin/python main.py
第三点用 pipx
或者 uv tool
我用 emacs 处理 python 虚拟环境的经验是这样的。
首先,我使用 uv 做包管理。因为 uv 添加一个新的包到环境里是使用的软链接,这样如果有两个环境使用了同一个包的同一个版本,不会把这个包所需要的空间算两遍。我在每一个环境里面都会下载 ruff 和 basedpyright 给 lsp-bridge使用。
然后,我写了一个函数在让 emacs 在执行了 counsel-projectile-switch-project 后自动切换 python 的虚拟环境。我写代码的时候就切换到一个专门的工作区来写。目前我没觉得这样操作有什么问题。