能否通过设置环境变量让 conda 切换虚拟环境

最近又想提升一样Emacs使用体验,打算从配置Python开发环境开始,感觉越学越乱了
这里我实在搞不懂(又可能明天就懂了)lsp-mode怎么切换虚拟环境
我只想到一种办法,但是编程能力有限
我的想法是这样的,在Python项目下新建一个文件.env,其中写

env=conda env name

lsp切换到当前目录下时,通过.env文件切换conda环境


不知道有没有解决方法,请指点

我用的direnv 用.envrc文件去配置虚拟环境跟第三方库目录等

可以参考下spacemacs的python 配置,里面用的了pyvenv等。这个是我在参考spacemacs后的python配置。

还请提供一下您的例子
@songpeng 切换环境的代码具体是哪个,我没看出来

你自己读读emacs pyvenv 这个包就好了。

我也想从pycharm转到emacs,用的是anaconda虚拟的环境。谁能提供一下配置文件供参考一下?我已经10多年没用emacs了。

可以在项目目录下新建一个 .dir-locals.el 来设置变量,类似这样

;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")

((python-mode . ((eval . (lsp-register-custom-settings
                          '(("python.pythonPath" "/home/wts/.anaconda3/envs/iswc/bin/python"
                             "python.venvPath" "/home/wts/.anaconda3/envs/iswc")))))))

看您最近的发的几个帖子,可能建议你先从 Spacemacs 或者 Doom 开始,然后再慢慢学习。

这个跟emacs没太大关系 其实就是direnv的作用,如果你喜欢这个工具的话

这是一个.envrc的配置

export VIRTUAL_ENV=$HOME/python/venv
layout python-venv python3.6
export PYTHONPATH=$PYTHONPATH:$HOME/repos/myproject

第一行添加了虚拟环境的目录,第二行是个工具激活虚拟环境,是老版本的做法,但是我习惯了,第三行添加一些额外的包检索目录

另外我用pyright,因为是js实现的,我可以用npm全局安装,就不需要每个虚拟环境去安装一个python的pyls之类的包了,保持环境干净

再另外,如果你也用doom的话,+flag里面有很多预置的,如 conda/pipenv/poetry 之类的,可以探索一下,找到自己的使用习惯

再补充下上面direnv第二行配置的wiki,刚找了下想起来了,是因为新版本有自己的虚拟环境管理方式,而我习惯自己管理虚拟环境,所以用了wiki里面的老方法

最后再补充一个,就是.envrc 这个文件也会污染项目目录,可以添加到.git/info/exclude 里面排除掉。如果你也用magit的话,I p 即可编辑(magit-gitignore)

看来您对这方面很有经验,还请多指点一下
doom怎么处理这个虚拟环境?有教程文章吗

还有,我在尝试用add-dir-local-variable的时候,没有发现一个可以设置的变量是lsp-register-custom-settings

add-dir-local-variable->python-mode->eval

没咋用过 doom,你直接看 Emacs 咋处理的就好

PS 用上面的 direnv 应该也是可以的,我之前嫌弃切换目录有点卡,就没用了。

我的项目跟目录里也有个.emacs.d文件夹了,是否把这个配置文件放到项目的.emacs.d文件夹里?另外,在eshell下似乎也用不了conda命令。

.emacs.d 只要放到 $HOME 下就好了呀?.dir-locals.el 是放到项目目录下的。

如果是 Mac GUI 下需要这个插件 https://github.com/purcell/exec-path-from-shell/tree/master 来加载路径。 所以这是为啥我建议你从成熟配置开始的原因🤣,它们都帮你处理好了

好的,谢谢。我正在学gnu emacs和Lisp语言。

这个设置直接用M-x shell可以进入虚拟环境了,eshell不行。就用shell就可以,谢谢。

这个设置放到项目根目录下,根本不产生任何作用,没有任何变化。

你想要啥变化。。。只是一个示例,如果在项目目录下打开 python 文件,会执行后面的命令罢了,如果你不用 lsp 自然没啥用?

项目根目录下的子目录里打开python文件执行,并没用使用这个el文件指定的虚拟python解释器,仍然是用系统的python。

说实话,我觉得对话可能没法继续进行下去。比如说怎么执行的,(e)shell 里面 输入 python?你每次都不描述清楚具体步骤,然后让人猜。

如果你是希望打开 shell 或者 eshell 使用特定的 Conda env,你有用过 https://github.com/necaris/conda.el 么?可以通过这个包的函数手动切换么?如果用过不行,你做了什么,配置是怎么样的,是哪一步遇到了问题?

不好意思,我没说清楚。我是这样操作的,M-x shell进去后,直接是conda虚拟环境的基本环境(base),可以用conda命令切换环境。但如果M-x eshell进去后,不是(base)基本环境,也不能conda命令切换环境。我装了anaconda-mode的,还必须再装一个conda.el吗?